django-cfg 1.4.21__py3-none-any.whl → 1.4.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +36 -7
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/METADATA +1 -1
- django_cfg-1.4.24.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/licenses/LICENSE +0 -0
@@ -4,20 +4,16 @@
|
|
4
4
|
Display Django project structure in a tree format based on configuration.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import os
|
8
7
|
import subprocess
|
9
8
|
from pathlib import Path
|
10
|
-
from typing import List, Optional
|
11
9
|
|
12
|
-
from django.core.management.base import BaseCommand, CommandError
|
13
10
|
from django.conf import settings
|
14
|
-
from
|
15
|
-
|
11
|
+
from django.core.management.base import BaseCommand, CommandError
|
16
12
|
|
17
13
|
from django_cfg.core.state import get_current_config
|
14
|
+
from django_cfg.modules.django_logging import get_logger
|
18
15
|
from django_cfg.utils.path_resolution import PathResolver
|
19
16
|
|
20
|
-
|
21
17
|
logger = get_logger('tree')
|
22
18
|
|
23
19
|
class Command(BaseCommand):
|
@@ -29,7 +25,7 @@ class Command(BaseCommand):
|
|
29
25
|
is_destructive = False
|
30
26
|
|
31
27
|
help = "Display Django project structure based on django-cfg configuration"
|
32
|
-
|
28
|
+
|
33
29
|
def add_arguments(self, parser):
|
34
30
|
"""Add command arguments."""
|
35
31
|
parser.add_argument(
|
@@ -65,7 +61,7 @@ class Command(BaseCommand):
|
|
65
61
|
)
|
66
62
|
parser.add_argument(
|
67
63
|
'--include-docker',
|
68
|
-
action='store_true',
|
64
|
+
action='store_true',
|
69
65
|
help='Include Docker configuration and volumes'
|
70
66
|
)
|
71
67
|
parser.add_argument(
|
@@ -84,21 +80,21 @@ class Command(BaseCommand):
|
|
84
80
|
default='tree',
|
85
81
|
help='Output format (default: tree)'
|
86
82
|
)
|
87
|
-
|
83
|
+
|
88
84
|
def handle(self, *args, **options):
|
89
85
|
"""Execute the command."""
|
90
86
|
logger.info("Starting tree command")
|
91
87
|
try:
|
92
88
|
# Get django-cfg configuration
|
93
89
|
config = get_current_config()
|
94
|
-
|
90
|
+
|
95
91
|
# Determine base directory
|
96
92
|
base_dir = self.get_base_directory(config)
|
97
|
-
|
93
|
+
|
98
94
|
self.stdout.write(
|
99
95
|
self.style.SUCCESS(f"📁 Django Project Structure: {base_dir}")
|
100
96
|
)
|
101
|
-
|
97
|
+
|
102
98
|
# Try to get environment info
|
103
99
|
try:
|
104
100
|
env_info = getattr(config, 'env_mode', 'unknown')
|
@@ -107,9 +103,9 @@ class Command(BaseCommand):
|
|
107
103
|
)
|
108
104
|
except Exception:
|
109
105
|
pass
|
110
|
-
|
106
|
+
|
111
107
|
self.stdout.write("")
|
112
|
-
|
108
|
+
|
113
109
|
# Check if tree command is available
|
114
110
|
if not self.is_tree_available():
|
115
111
|
self.stdout.write(
|
@@ -118,10 +114,10 @@ class Command(BaseCommand):
|
|
118
114
|
self.display_fallback_tree(base_dir, options)
|
119
115
|
else:
|
120
116
|
self.display_tree(base_dir, options)
|
121
|
-
|
117
|
+
|
122
118
|
except Exception as e:
|
123
119
|
raise CommandError(f"Failed to display project tree: {e}")
|
124
|
-
|
120
|
+
|
125
121
|
def get_base_directory(self, config) -> Path:
|
126
122
|
"""Get the base directory for the Django project tree."""
|
127
123
|
try:
|
@@ -132,35 +128,35 @@ class Command(BaseCommand):
|
|
132
128
|
# Try to get from config
|
133
129
|
if hasattr(config, 'base_dir') and config.base_dir:
|
134
130
|
return Path(config.base_dir)
|
135
|
-
|
131
|
+
|
136
132
|
# Fallback to Django BASE_DIR
|
137
133
|
if hasattr(settings, 'BASE_DIR'):
|
138
134
|
return Path(settings.BASE_DIR)
|
139
|
-
|
135
|
+
|
140
136
|
# Last resort: current working directory
|
141
137
|
return Path.cwd()
|
142
|
-
|
138
|
+
|
143
139
|
except Exception as e:
|
144
140
|
self.stdout.write(
|
145
141
|
self.style.WARNING(f"Could not determine base directory: {e}")
|
146
142
|
)
|
147
143
|
return Path.cwd()
|
148
|
-
|
144
|
+
|
149
145
|
def is_tree_available(self) -> bool:
|
150
146
|
"""Check if tree command is available."""
|
151
147
|
try:
|
152
|
-
subprocess.run(['tree', '--version'],
|
153
|
-
capture_output=True,
|
148
|
+
subprocess.run(['tree', '--version'],
|
149
|
+
capture_output=True,
|
154
150
|
check=True)
|
155
151
|
return True
|
156
152
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
157
153
|
return False
|
158
|
-
|
154
|
+
|
159
155
|
def build_ignore_pattern(self, options) -> str:
|
160
156
|
"""Build ignore pattern for tree command."""
|
161
157
|
if options['no_ignore']:
|
162
158
|
return ""
|
163
|
-
|
159
|
+
|
164
160
|
# Default ignore patterns
|
165
161
|
default_ignores = [
|
166
162
|
'node_modules',
|
@@ -190,69 +186,69 @@ class Command(BaseCommand):
|
|
190
186
|
'django_cfg',
|
191
187
|
# Package manager files
|
192
188
|
'package-lock.json',
|
193
|
-
'pnpm-lock.yaml',
|
189
|
+
'pnpm-lock.yaml',
|
194
190
|
'poetry.lock',
|
195
191
|
'yarn.lock',
|
196
192
|
# Empty/system directories
|
197
193
|
'db',
|
198
194
|
'static'
|
199
195
|
]
|
200
|
-
|
196
|
+
|
201
197
|
# Conditionally add patterns based on options
|
202
198
|
# Note: @docs folders are now included by default to show documentation
|
203
|
-
|
199
|
+
|
204
200
|
if not options.get('include_docker'):
|
205
201
|
default_ignores.extend([
|
206
202
|
'docker',
|
207
203
|
'devops'
|
208
204
|
])
|
209
|
-
|
205
|
+
|
210
206
|
if not options.get('include_logs'):
|
211
207
|
default_ignores.extend([
|
212
208
|
'logs',
|
213
209
|
'*.log',
|
214
210
|
'log'
|
215
211
|
])
|
216
|
-
|
212
|
+
|
217
213
|
# Add custom ignores
|
218
214
|
if options['custom_ignore']:
|
219
215
|
custom_ignores = options['custom_ignore'].split('|')
|
220
216
|
default_ignores.extend(custom_ignores)
|
221
|
-
|
217
|
+
|
222
218
|
return '|'.join(default_ignores)
|
223
|
-
|
219
|
+
|
224
220
|
def display_tree(self, base_dir: Path, options):
|
225
221
|
"""Display tree using system tree command."""
|
226
222
|
try:
|
227
223
|
# Build tree command
|
228
224
|
cmd = ['tree']
|
229
|
-
|
225
|
+
|
230
226
|
# Add ignore pattern
|
231
227
|
ignore_pattern = self.build_ignore_pattern(options)
|
232
228
|
if ignore_pattern:
|
233
229
|
cmd.extend(['-I', ignore_pattern])
|
234
|
-
|
230
|
+
|
235
231
|
# Add options
|
236
232
|
cmd.append('--dirsfirst') # Directories first
|
237
|
-
|
233
|
+
|
238
234
|
if options['depth']:
|
239
235
|
cmd.extend(['-L', str(options['depth'])])
|
240
|
-
|
236
|
+
|
241
237
|
if options['dirs_only']:
|
242
238
|
cmd.append('-d')
|
243
|
-
|
239
|
+
|
244
240
|
if options['all']:
|
245
241
|
cmd.append('-a')
|
246
|
-
|
242
|
+
|
247
243
|
# Add format options
|
248
244
|
if options['format'] == 'json':
|
249
245
|
cmd.append('-J')
|
250
246
|
elif options['format'] == 'xml':
|
251
247
|
cmd.append('-X')
|
252
|
-
|
248
|
+
|
253
249
|
# Add base directory
|
254
250
|
cmd.append(str(base_dir))
|
255
|
-
|
251
|
+
|
256
252
|
# Execute command
|
257
253
|
if options['output']:
|
258
254
|
with open(options['output'], 'w') as f:
|
@@ -271,20 +267,20 @@ class Command(BaseCommand):
|
|
271
267
|
self.stdout.write(
|
272
268
|
self.style.ERROR("❌ Tree command failed")
|
273
269
|
)
|
274
|
-
|
270
|
+
|
275
271
|
except Exception as e:
|
276
272
|
self.stdout.write(
|
277
273
|
self.style.ERROR(f"❌ Failed to execute tree command: {e}")
|
278
274
|
)
|
279
275
|
self.display_fallback_tree(base_dir, options)
|
280
|
-
|
276
|
+
|
281
277
|
def display_fallback_tree(self, base_dir: Path, options):
|
282
278
|
"""Fallback tree implementation using Python."""
|
283
279
|
self.stdout.write("🐍 Using Python fallback implementation:")
|
284
280
|
self.stdout.write("")
|
285
|
-
|
281
|
+
|
286
282
|
ignore_patterns = self.build_ignore_pattern(options).split('|') if not options['no_ignore'] else []
|
287
|
-
|
283
|
+
|
288
284
|
def should_ignore(path: Path) -> bool:
|
289
285
|
"""Check if path should be ignored."""
|
290
286
|
name = path.name
|
@@ -298,12 +294,12 @@ class Command(BaseCommand):
|
|
298
294
|
elif pattern == name:
|
299
295
|
return True
|
300
296
|
return False
|
301
|
-
|
297
|
+
|
302
298
|
def print_tree(directory: Path, prefix: str = "", depth: int = 0):
|
303
299
|
"""Recursively print directory tree."""
|
304
300
|
if options['depth'] and depth >= options['depth']:
|
305
301
|
return
|
306
|
-
|
302
|
+
|
307
303
|
try:
|
308
304
|
items = []
|
309
305
|
for item in directory.iterdir():
|
@@ -312,14 +308,14 @@ class Command(BaseCommand):
|
|
312
308
|
if should_ignore(item):
|
313
309
|
continue
|
314
310
|
items.append(item)
|
315
|
-
|
311
|
+
|
316
312
|
# Sort: directories first, then files
|
317
313
|
items.sort(key=lambda x: (not x.is_dir(), x.name.lower()))
|
318
|
-
|
314
|
+
|
319
315
|
for i, item in enumerate(items):
|
320
316
|
is_last = i == len(items) - 1
|
321
317
|
current_prefix = "└── " if is_last else "├── "
|
322
|
-
|
318
|
+
|
323
319
|
if item.is_dir():
|
324
320
|
self.stdout.write(f"{prefix}{current_prefix}📁 {item.name}/")
|
325
321
|
if not options['dirs_only']:
|
@@ -329,16 +325,16 @@ class Command(BaseCommand):
|
|
329
325
|
# Add file type emoji
|
330
326
|
emoji = self.get_file_emoji(item)
|
331
327
|
self.stdout.write(f"{prefix}{current_prefix}{emoji} {item.name}")
|
332
|
-
|
328
|
+
|
333
329
|
except PermissionError:
|
334
330
|
self.stdout.write(f"{prefix}❌ Permission denied")
|
335
|
-
|
331
|
+
|
336
332
|
print_tree(base_dir)
|
337
|
-
|
333
|
+
|
338
334
|
def get_file_emoji(self, file_path: Path) -> str:
|
339
335
|
"""Get emoji for file type."""
|
340
336
|
suffix = file_path.suffix.lower()
|
341
|
-
|
337
|
+
|
342
338
|
emoji_map = {
|
343
339
|
'.py': '🐍',
|
344
340
|
'.js': '📜',
|
@@ -381,10 +377,10 @@ class Command(BaseCommand):
|
|
381
377
|
'Pipfile': '📦',
|
382
378
|
'Pipfile.lock': '🔒',
|
383
379
|
}
|
384
|
-
|
380
|
+
|
385
381
|
# Check full filename first
|
386
382
|
if file_path.name in emoji_map:
|
387
383
|
return emoji_map[file_path.name]
|
388
|
-
|
384
|
+
|
389
385
|
# Then check extension
|
390
386
|
return emoji_map.get(suffix, '📄')
|
@@ -2,41 +2,42 @@
|
|
2
2
|
Display mixin for convenient wrapper methods.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from typing import
|
5
|
+
from typing import Any, Optional
|
6
|
+
|
6
7
|
from django.utils.safestring import SafeString
|
7
8
|
|
8
|
-
from ..utils.displays import UserDisplay, MoneyDisplay, StatusDisplay, DateTimeDisplay
|
9
|
-
from ..utils.badges import StatusBadge, CounterBadge
|
10
|
-
from ..models.display_models import UserDisplayConfig, MoneyDisplayConfig, DateTimeDisplayConfig
|
11
9
|
from ..models.badge_models import StatusBadgeConfig
|
10
|
+
from ..models.display_models import DateTimeDisplayConfig, MoneyDisplayConfig, UserDisplayConfig
|
11
|
+
from ..utils.badges import CounterBadge, StatusBadge
|
12
|
+
from ..utils.displays import DateTimeDisplay, MoneyDisplay, UserDisplay
|
12
13
|
|
13
14
|
|
14
15
|
class DisplayMixin:
|
15
16
|
"""Mixin for Django ModelAdmin classes with convenient display methods."""
|
16
|
-
|
17
|
+
|
17
18
|
def display_user_with_avatar(self, obj: Any, user_field: str = 'user',
|
18
19
|
config: Optional[UserDisplayConfig] = None) -> list:
|
19
20
|
"""Display user with avatar for @display(header=True)."""
|
20
21
|
user = getattr(obj, user_field, None)
|
21
22
|
return UserDisplay.with_avatar(user, config)
|
22
|
-
|
23
|
+
|
23
24
|
def display_user_simple(self, obj: Any, user_field: str = 'user',
|
24
25
|
config: Optional[UserDisplayConfig] = None) -> SafeString:
|
25
26
|
"""Simple user display."""
|
26
27
|
user = getattr(obj, user_field, None)
|
27
28
|
return UserDisplay.simple(user, config)
|
28
|
-
|
29
|
+
|
29
30
|
def display_money_amount(self, obj: Any, amount_field: str,
|
30
31
|
config: Optional[MoneyDisplayConfig] = None) -> SafeString:
|
31
32
|
"""Display money amount."""
|
32
33
|
amount = getattr(obj, amount_field, None)
|
33
34
|
return MoneyDisplay.amount(amount, config)
|
34
|
-
|
35
|
+
|
35
36
|
def display_money_breakdown(self, obj: Any, main_field: str, breakdown_fields: dict,
|
36
37
|
config: Optional[MoneyDisplayConfig] = None) -> SafeString:
|
37
38
|
"""Display money with breakdown."""
|
38
39
|
main_amount = getattr(obj, main_field, 0)
|
39
|
-
|
40
|
+
|
40
41
|
breakdown_items = []
|
41
42
|
for label, field_name in breakdown_fields.items():
|
42
43
|
amount = getattr(obj, field_name, 0)
|
@@ -45,32 +46,32 @@ class DisplayMixin:
|
|
45
46
|
'amount': amount,
|
46
47
|
'color': 'warning' if amount > 0 else 'secondary'
|
47
48
|
})
|
48
|
-
|
49
|
+
|
49
50
|
return MoneyDisplay.with_breakdown(main_amount, breakdown_items, config)
|
50
|
-
|
51
|
+
|
51
52
|
def display_status_auto(self, obj: Any, status_field: str = 'status',
|
52
53
|
config: Optional[StatusBadgeConfig] = None) -> SafeString:
|
53
54
|
"""Display status with auto color mapping."""
|
54
55
|
status = getattr(obj, status_field, '')
|
55
56
|
return StatusBadge.auto(status, config)
|
56
|
-
|
57
|
+
|
57
58
|
def display_datetime_relative(self, obj: Any, datetime_field: str,
|
58
59
|
config: Optional[DateTimeDisplayConfig] = None) -> SafeString:
|
59
60
|
"""Display datetime with relative time."""
|
60
61
|
dt = getattr(obj, datetime_field, None)
|
61
62
|
return DateTimeDisplay.relative(dt, config)
|
62
|
-
|
63
|
+
|
63
64
|
def display_datetime_compact(self, obj: Any, datetime_field: str,
|
64
65
|
config: Optional[DateTimeDisplayConfig] = None) -> SafeString:
|
65
66
|
"""Display datetime compact."""
|
66
67
|
dt = getattr(obj, datetime_field, None)
|
67
68
|
return DateTimeDisplay.compact(dt, config)
|
68
|
-
|
69
|
+
|
69
70
|
def display_count_simple(self, obj: Any, count_field: str, label: str = None) -> SafeString:
|
70
71
|
"""Display count as badge."""
|
71
72
|
count = getattr(obj, count_field, 0)
|
72
73
|
return CounterBadge.simple(count, label)
|
73
|
-
|
74
|
+
|
74
75
|
def display_related_count(self, obj: Any, related_name: str, label: str = None) -> SafeString:
|
75
76
|
"""Display count of related objects."""
|
76
77
|
try:
|
@@ -3,7 +3,8 @@ Query optimization mixin for performance.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
import logging
|
6
|
-
from typing import
|
6
|
+
from typing import Any, Dict, List
|
7
|
+
|
7
8
|
from django.contrib import admin
|
8
9
|
from django.db.models import QuerySet
|
9
10
|
|
@@ -12,30 +13,30 @@ logger = logging.getLogger(__name__)
|
|
12
13
|
|
13
14
|
class OptimizedModelAdmin(admin.ModelAdmin):
|
14
15
|
"""Optimized ModelAdmin with automatic query optimization."""
|
15
|
-
|
16
|
+
|
16
17
|
# Performance settings
|
17
18
|
list_per_page = 50
|
18
19
|
show_full_result_count = False
|
19
|
-
|
20
|
+
|
20
21
|
# Fields for optimization - override in subclasses
|
21
22
|
select_related_fields: List[str] = []
|
22
23
|
prefetch_related_fields: List[str] = []
|
23
24
|
annotations: Dict[str, Any] = {}
|
24
|
-
|
25
|
+
|
25
26
|
def get_queryset(self, request) -> QuerySet:
|
26
27
|
"""Optimize queryset with select_related and prefetch_related."""
|
27
28
|
qs = super().get_queryset(request)
|
28
|
-
|
29
|
+
|
29
30
|
if self.select_related_fields:
|
30
31
|
qs = qs.select_related(*self.select_related_fields)
|
31
32
|
logger.debug(f"Applied select_related: {self.select_related_fields}")
|
32
|
-
|
33
|
+
|
33
34
|
if self.prefetch_related_fields:
|
34
35
|
qs = qs.prefetch_related(*self.prefetch_related_fields)
|
35
36
|
logger.debug(f"Applied prefetch_related: {self.prefetch_related_fields}")
|
36
|
-
|
37
|
+
|
37
38
|
if self.annotations:
|
38
39
|
qs = qs.annotate(**self.annotations)
|
39
40
|
logger.debug(f"Applied annotations: {list(self.annotations.keys())}")
|
40
|
-
|
41
|
+
|
41
42
|
return qs
|
@@ -5,18 +5,19 @@ Provides convenient decorators and utilities for creating standalone action butt
|
|
5
5
|
that work independently of selected items (not bulk actions).
|
6
6
|
"""
|
7
7
|
|
8
|
-
|
8
|
+
import threading
|
9
9
|
from functools import wraps
|
10
|
+
from typing import Any, Callable, Optional
|
11
|
+
|
10
12
|
from django.contrib import messages
|
11
|
-
from django.shortcuts import redirect
|
12
13
|
from django.http import HttpResponse
|
13
|
-
import
|
14
|
-
|
14
|
+
from django.shortcuts import redirect
|
15
15
|
from unfold.decorators import action as unfold_action
|
16
16
|
from unfold.enums import ActionVariant as UnfoldActionVariant
|
17
|
+
|
17
18
|
from django_cfg.modules.django_logging import get_logger
|
18
|
-
from ..models.action_models import ActionVariant
|
19
19
|
|
20
|
+
from ..models.action_models import ActionVariant
|
20
21
|
|
21
22
|
logger = get_logger("django_admin.mixins.standalone_actions")
|
22
23
|
|
@@ -68,30 +69,30 @@ def standalone_action(
|
|
68
69
|
logger.info(f"Background action {func.__name__} completed: {result}")
|
69
70
|
except Exception as e:
|
70
71
|
logger.error(f"Background action {func.__name__} failed: {e}")
|
71
|
-
|
72
|
+
|
72
73
|
thread = threading.Thread(target=background_task)
|
73
74
|
thread.daemon = True
|
74
75
|
thread.start()
|
75
|
-
|
76
|
+
|
76
77
|
# Show immediate success message
|
77
78
|
if success_message:
|
78
79
|
messages.success(request, success_message)
|
79
80
|
else:
|
80
81
|
messages.success(request, f"{description} started in background.")
|
81
|
-
|
82
|
+
|
82
83
|
else:
|
83
84
|
# Run synchronously
|
84
85
|
result = func(self, request)
|
85
|
-
|
86
|
+
|
86
87
|
# Show success message
|
87
88
|
if success_message:
|
88
89
|
msg = success_message.format(result=result) if result else success_message
|
89
90
|
messages.success(request, msg)
|
90
91
|
else:
|
91
92
|
messages.success(request, f"{description} completed successfully.")
|
92
|
-
|
93
|
+
|
93
94
|
logger.info(f"Standalone action {func.__name__} executed by {request.user.username}")
|
94
|
-
|
95
|
+
|
95
96
|
except Exception as e:
|
96
97
|
# Show error message
|
97
98
|
if error_message:
|
@@ -99,12 +100,12 @@ def standalone_action(
|
|
99
100
|
messages.error(request, msg)
|
100
101
|
else:
|
101
102
|
messages.error(request, f"❌ {description} failed: {str(e)}")
|
102
|
-
|
103
|
+
|
103
104
|
logger.error(f"Standalone action {func.__name__} failed: {e}")
|
104
|
-
|
105
|
+
|
105
106
|
# Always redirect back
|
106
107
|
return redirect(request.META.get('HTTP_REFERER', '/admin/'))
|
107
|
-
|
108
|
+
|
108
109
|
# Convert ActionVariant to UnfoldActionVariant
|
109
110
|
unfold_variant = UnfoldActionVariant.DEFAULT
|
110
111
|
if variant:
|
@@ -117,10 +118,10 @@ def standalone_action(
|
|
117
118
|
ActionVariant.DANGER: UnfoldActionVariant.DANGER,
|
118
119
|
}
|
119
120
|
unfold_variant = variant_mapping.get(variant, UnfoldActionVariant.DEFAULT)
|
120
|
-
|
121
|
+
|
121
122
|
# Auto-generate url_path if not provided
|
122
123
|
final_url_path = url_path or func.__name__.replace('_', '-')
|
123
|
-
|
124
|
+
|
124
125
|
# Apply unfold decorator
|
125
126
|
decorator_kwargs = {
|
126
127
|
'description': description,
|
@@ -129,9 +130,9 @@ def standalone_action(
|
|
129
130
|
}
|
130
131
|
if icon:
|
131
132
|
decorator_kwargs['icon'] = icon
|
132
|
-
|
133
|
+
|
133
134
|
return unfold_action(**decorator_kwargs)(wrapper)
|
134
|
-
|
135
|
+
|
135
136
|
return decorator
|
136
137
|
|
137
138
|
|
@@ -153,11 +154,11 @@ class StandaloneActionsMixin:
|
|
153
154
|
# Your update logic
|
154
155
|
return "Data updated"
|
155
156
|
"""
|
156
|
-
|
157
|
+
|
157
158
|
def get_standalone_actions(self):
|
158
159
|
"""Get list of standalone action method names."""
|
159
160
|
return getattr(self, 'actions_list', [])
|
160
|
-
|
161
|
+
|
161
162
|
def execute_background_task(self, task_func: Callable, *args, **kwargs):
|
162
163
|
"""
|
163
164
|
Utility method to execute tasks in background.
|
@@ -174,12 +175,12 @@ class StandaloneActionsMixin:
|
|
174
175
|
except Exception as e:
|
175
176
|
logger.error(f"Background task {task_func.__name__} failed: {e}")
|
176
177
|
raise
|
177
|
-
|
178
|
+
|
178
179
|
thread = threading.Thread(target=background_task)
|
179
180
|
thread.daemon = True
|
180
181
|
thread.start()
|
181
182
|
return thread
|
182
|
-
|
183
|
+
|
183
184
|
def send_admin_notification(self, request, message: str, level: str = 'INFO'):
|
184
185
|
"""
|
185
186
|
Send notification to admin user.
|
@@ -195,8 +196,8 @@ class StandaloneActionsMixin:
|
|
195
196
|
'WARNING': messages.WARNING,
|
196
197
|
'ERROR': messages.ERROR,
|
197
198
|
}
|
198
|
-
|
199
|
+
|
199
200
|
django_level = level_mapping.get(level.upper(), messages.INFO)
|
200
201
|
messages.add_message(request, django_level, message)
|
201
|
-
|
202
|
+
|
202
203
|
logger.info(f"Admin notification sent to {request.user.username}: {message}")
|
@@ -2,15 +2,15 @@
|
|
2
2
|
Pydantic 2 models for configuration.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from .
|
6
|
-
from .display_models import UserDisplayConfig, MoneyDisplayConfig, DateTimeDisplayConfig
|
5
|
+
from .action_models import ActionConfig, ActionVariant
|
7
6
|
from .badge_models import BadgeConfig, BadgeVariant, StatusBadgeConfig
|
8
|
-
from .
|
7
|
+
from .base import BaseConfig
|
8
|
+
from .display_models import DateTimeDisplayConfig, MoneyDisplayConfig, UserDisplayConfig
|
9
9
|
|
10
10
|
__all__ = [
|
11
11
|
"BaseConfig",
|
12
12
|
"UserDisplayConfig",
|
13
|
-
"MoneyDisplayConfig",
|
13
|
+
"MoneyDisplayConfig",
|
14
14
|
"DateTimeDisplayConfig",
|
15
15
|
"BadgeConfig",
|
16
16
|
"BadgeVariant",
|
@@ -2,9 +2,11 @@
|
|
2
2
|
Badge configuration models.
|
3
3
|
"""
|
4
4
|
|
5
|
+
from typing import Dict, Optional
|
6
|
+
|
5
7
|
from pydantic import Field
|
6
|
-
|
7
|
-
from .base import
|
8
|
+
|
9
|
+
from .base import BadgeVariant, BaseConfig
|
8
10
|
|
9
11
|
|
10
12
|
class BadgeConfig(BaseConfig):
|
@@ -2,15 +2,15 @@
|
|
2
2
|
Base Pydantic 2 models.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from pydantic import BaseModel, Field, ConfigDict
|
6
|
-
from typing import List
|
7
5
|
from enum import Enum
|
8
6
|
|
7
|
+
from pydantic import BaseModel, ConfigDict, Field
|
8
|
+
|
9
9
|
|
10
10
|
class BaseConfig(BaseModel):
|
11
11
|
"""Base configuration for all utilities."""
|
12
12
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
13
|
-
|
13
|
+
|
14
14
|
cache_timeout: int = Field(default=300, ge=0, le=3600)
|
15
15
|
enable_icons: bool = Field(default=True)
|
16
16
|
debug_mode: bool = Field(default=False)
|