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,14 @@ Response builder for LLM client.
|
|
4
4
|
Builds Pydantic response objects from API responses.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import time
|
8
7
|
import logging
|
9
8
|
from datetime import datetime
|
10
9
|
from typing import Optional
|
10
|
+
|
11
11
|
from openai.types.chat import ChatCompletion
|
12
12
|
|
13
13
|
from ..costs import calculate_chat_cost
|
14
|
-
from ..models import
|
14
|
+
from ..models import ChatChoice, ChatCompletionResponse, TokenUsage
|
15
15
|
|
16
16
|
logger = logging.getLogger(__name__)
|
17
17
|
|
@@ -6,6 +6,7 @@ Provides token counting functionality for various LLM models.
|
|
6
6
|
|
7
7
|
import logging
|
8
8
|
from typing import Dict, List
|
9
|
+
|
9
10
|
import tiktoken
|
10
11
|
|
11
12
|
logger = logging.getLogger(__name__)
|
@@ -13,11 +14,11 @@ logger = logging.getLogger(__name__)
|
|
13
14
|
|
14
15
|
class Tokenizer:
|
15
16
|
"""Token counting utility using tiktoken."""
|
16
|
-
|
17
|
+
|
17
18
|
def __init__(self):
|
18
19
|
"""Initialize tokenizer with encoder cache."""
|
19
20
|
self.encoders = {}
|
20
|
-
|
21
|
+
|
21
22
|
def _get_encoder(self, model: str):
|
22
23
|
"""Get tiktoken encoder for model."""
|
23
24
|
if model not in self.encoders:
|
@@ -28,9 +29,9 @@ class Tokenizer:
|
|
28
29
|
except Exception as e:
|
29
30
|
logger.warning(f"Failed to get encoder for {model}, using cl100k_base: {e}")
|
30
31
|
self.encoders[model] = tiktoken.get_encoding("cl100k_base")
|
31
|
-
|
32
|
+
|
32
33
|
return self.encoders[model]
|
33
|
-
|
34
|
+
|
34
35
|
def _get_encoding_name(self, model: str) -> str:
|
35
36
|
"""Get encoding name for model."""
|
36
37
|
# GPT-4 and GPT-3.5 models use cl100k_base
|
@@ -42,7 +43,7 @@ class Tokenizer:
|
|
42
43
|
# Default to cl100k_base for most modern models
|
43
44
|
else:
|
44
45
|
return "cl100k_base"
|
45
|
-
|
46
|
+
|
46
47
|
def count_tokens(self, text: str, model: str) -> int:
|
47
48
|
"""
|
48
49
|
Count tokens in text using tiktoken.
|
@@ -56,7 +57,7 @@ class Tokenizer:
|
|
56
57
|
"""
|
57
58
|
encoder = self._get_encoder(model)
|
58
59
|
return len(encoder.encode(text))
|
59
|
-
|
60
|
+
|
60
61
|
def count_messages_tokens(self, messages: List[Dict[str, str]], model: str) -> int:
|
61
62
|
"""
|
62
63
|
Count total tokens in messages.
|
@@ -69,15 +70,15 @@ class Tokenizer:
|
|
69
70
|
Total number of tokens
|
70
71
|
"""
|
71
72
|
total_tokens = 0
|
72
|
-
|
73
|
+
|
73
74
|
for message in messages:
|
74
75
|
# Format message as it would be sent to API
|
75
76
|
role = message.get('role', 'user')
|
76
77
|
content = message.get('content', '')
|
77
78
|
formatted_message = f"{role}\n{content}"
|
78
79
|
total_tokens += self.count_tokens(formatted_message, model)
|
79
|
-
|
80
|
+
|
80
81
|
# Add overhead for message formatting
|
81
82
|
total_tokens += len(messages) * 4 # Rough estimate for message overhead
|
82
|
-
|
83
|
+
|
83
84
|
return total_tokens
|
@@ -2,7 +2,7 @@
|
|
2
2
|
Translation functionality with caching by language pairs
|
3
3
|
"""
|
4
4
|
|
5
|
-
from .translator import DjangoTranslator, TranslationError
|
6
5
|
from .cache import TranslationCacheManager
|
6
|
+
from .translator import DjangoTranslator, TranslationError
|
7
7
|
|
8
8
|
__all__ = ['DjangoTranslator', 'TranslationError', 'TranslationCacheManager']
|
@@ -2,18 +2,19 @@
|
|
2
2
|
Translation Cache Manager - stores translations by language pairs like in unreal_llm
|
3
3
|
"""
|
4
4
|
|
5
|
-
import json
|
6
5
|
import hashlib
|
6
|
+
import json
|
7
7
|
import logging
|
8
8
|
from pathlib import Path
|
9
|
-
from typing import Dict, Optional
|
9
|
+
from typing import Any, Dict, Optional
|
10
|
+
|
10
11
|
from cachetools import TTLCache
|
11
12
|
|
12
13
|
logger = logging.getLogger(__name__)
|
13
14
|
|
14
15
|
class TranslationCacheManager:
|
15
16
|
"""Manages translation caching with TTL and file persistence (per language pair)"""
|
16
|
-
|
17
|
+
|
17
18
|
def __init__(self, cache_dir: Optional[str] = None, ttl_hours: int = 24):
|
18
19
|
"""
|
19
20
|
Initialize translation cache manager
|
@@ -27,65 +28,65 @@ class TranslationCacheManager:
|
|
27
28
|
# Get the django_cfg module directory
|
28
29
|
module_dir = Path(__file__).parent.parent.parent.parent # django_cfg/modules/django_llm/translator -> django_cfg
|
29
30
|
default_cache_dir = module_dir / ".cache" / "llm_translate"
|
30
|
-
|
31
|
+
|
31
32
|
# Create cache directory if it doesn't exist
|
32
33
|
default_cache_dir.mkdir(parents=True, exist_ok=True)
|
33
34
|
else:
|
34
35
|
default_cache_dir = Path(cache_dir)
|
35
|
-
|
36
|
+
|
36
37
|
self.cache_dir = default_cache_dir
|
37
38
|
self.ttl_seconds = ttl_hours * 3600
|
38
|
-
|
39
|
+
|
39
40
|
# In-memory cache with TTL (like in unreal_llm)
|
40
41
|
self._memory_cache = TTLCache(maxsize=1000, ttl=self.ttl_seconds)
|
41
|
-
|
42
|
+
|
42
43
|
logger.info(f"Translation cache initialized: {self.cache_dir}")
|
43
|
-
|
44
|
+
|
44
45
|
def _get_cache_file(self, source_lang: str, target_lang: str) -> Path:
|
45
46
|
"""Get cache file path for language pair (like in unreal_llm)"""
|
46
47
|
return self.cache_dir / f"{source_lang}→{target_lang}.json"
|
47
|
-
|
48
|
+
|
48
49
|
def _get_text_hash(self, text: str) -> str:
|
49
50
|
"""Generate hash for text"""
|
50
51
|
return hashlib.md5(text.encode('utf-8')).hexdigest()
|
51
|
-
|
52
|
+
|
52
53
|
def _load_file_cache(self, source_lang: str, target_lang: str) -> Dict[str, Any]:
|
53
54
|
"""Load translations from file cache"""
|
54
55
|
cache_file = self._get_cache_file(source_lang, target_lang)
|
55
|
-
|
56
|
+
|
56
57
|
if not cache_file.exists():
|
57
58
|
return {}
|
58
|
-
|
59
|
+
|
59
60
|
try:
|
60
|
-
with open(cache_file,
|
61
|
+
with open(cache_file, encoding='utf-8') as f:
|
61
62
|
return json.load(f)
|
62
|
-
except (json.JSONDecodeError
|
63
|
+
except (OSError, json.JSONDecodeError) as e:
|
63
64
|
logger.warning(f"Failed to load cache file {cache_file}: {e}")
|
64
65
|
return {}
|
65
|
-
|
66
|
+
|
66
67
|
def _save_file_cache(self, source_lang: str, target_lang: str, cache_data: Dict[str, Any]):
|
67
68
|
"""Save translations to file cache"""
|
68
69
|
cache_file = self._get_cache_file(source_lang, target_lang)
|
69
|
-
|
70
|
+
|
70
71
|
try:
|
71
72
|
# Ensure directory exists
|
72
73
|
cache_file.parent.mkdir(parents=True, exist_ok=True)
|
73
|
-
|
74
|
+
|
74
75
|
with open(cache_file, 'w', encoding='utf-8') as f:
|
75
76
|
json.dump(cache_data, f, ensure_ascii=False, indent=2)
|
76
|
-
|
77
|
-
except
|
77
|
+
|
78
|
+
except OSError as e:
|
78
79
|
logger.error(f"Failed to save cache file {cache_file}: {e}")
|
79
|
-
|
80
|
+
|
80
81
|
def get(self, text: str, source_lang: str, target_lang: str) -> Optional[str]:
|
81
82
|
"""Get translation from cache"""
|
82
83
|
text_hash = self._get_text_hash(text)
|
83
84
|
cache_key = f"{source_lang}→{target_lang}:{text_hash}"
|
84
|
-
|
85
|
+
|
85
86
|
# Check memory cache first
|
86
87
|
if cache_key in self._memory_cache:
|
87
88
|
return self._memory_cache[cache_key]
|
88
|
-
|
89
|
+
|
89
90
|
# Check file cache
|
90
91
|
file_cache = self._load_file_cache(source_lang, target_lang)
|
91
92
|
if text_hash in file_cache:
|
@@ -93,24 +94,24 @@ class TranslationCacheManager:
|
|
93
94
|
# Store in memory cache
|
94
95
|
self._memory_cache[cache_key] = translation
|
95
96
|
return translation
|
96
|
-
|
97
|
+
|
97
98
|
return None
|
98
|
-
|
99
|
+
|
99
100
|
def set(self, text: str, source_lang: str, target_lang: str, translation: str):
|
100
101
|
"""Store translation in cache"""
|
101
102
|
text_hash = self._get_text_hash(text)
|
102
103
|
cache_key = f"{source_lang}→{target_lang}:{text_hash}"
|
103
|
-
|
104
|
+
|
104
105
|
# Store in memory cache
|
105
106
|
self._memory_cache[cache_key] = translation
|
106
|
-
|
107
|
+
|
107
108
|
# Store in file cache
|
108
109
|
file_cache = self._load_file_cache(source_lang, target_lang)
|
109
110
|
file_cache[text_hash] = translation
|
110
111
|
self._save_file_cache(source_lang, target_lang, file_cache)
|
111
|
-
|
112
|
+
|
112
113
|
logger.debug(f"Cached translation: {source_lang}→{target_lang} ({len(text)} chars)")
|
113
|
-
|
114
|
+
|
114
115
|
def clear(self, source_lang: Optional[str] = None, target_lang: Optional[str] = None):
|
115
116
|
"""Clear cache (all or specific language pair)"""
|
116
117
|
if source_lang and target_lang:
|
@@ -118,25 +119,25 @@ class TranslationCacheManager:
|
|
118
119
|
cache_file = self._get_cache_file(source_lang, target_lang)
|
119
120
|
if cache_file.exists():
|
120
121
|
cache_file.unlink()
|
121
|
-
|
122
|
+
|
122
123
|
# Clear from memory cache
|
123
124
|
prefix = f"{source_lang}→{target_lang}:"
|
124
125
|
keys_to_remove = [k for k in self._memory_cache.keys() if k.startswith(prefix)]
|
125
126
|
for key in keys_to_remove:
|
126
127
|
del self._memory_cache[key]
|
127
|
-
|
128
|
+
|
128
129
|
logger.info(f"Cleared cache for {source_lang}→{target_lang}")
|
129
130
|
else:
|
130
131
|
# Clear all caches
|
131
132
|
self._memory_cache.clear()
|
132
|
-
|
133
|
+
|
133
134
|
# Remove all cache files
|
134
135
|
if self.cache_dir.exists():
|
135
136
|
for cache_file in self.cache_dir.glob("*.json"):
|
136
137
|
cache_file.unlink()
|
137
|
-
|
138
|
+
|
138
139
|
logger.info("Cleared all translation caches")
|
139
|
-
|
140
|
+
|
140
141
|
def get_stats(self) -> Dict[str, Any]:
|
141
142
|
"""Get cache statistics"""
|
142
143
|
stats = {
|
@@ -144,7 +145,7 @@ class TranslationCacheManager:
|
|
144
145
|
'cache_dir': str(self.cache_dir),
|
145
146
|
'language_pairs': []
|
146
147
|
}
|
147
|
-
|
148
|
+
|
148
149
|
# Count file caches
|
149
150
|
if self.cache_dir.exists():
|
150
151
|
for cache_file in self.cache_dir.glob("*.json"):
|
@@ -155,5 +156,5 @@ class TranslationCacheManager:
|
|
155
156
|
'translations': len(file_cache),
|
156
157
|
'file_size': cache_file.stat().st_size
|
157
158
|
})
|
158
|
-
|
159
|
+
|
159
160
|
return stats
|
@@ -4,8 +4,8 @@ Language detection modules.
|
|
4
4
|
Script-based and dictionary-based language detection.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from .script_detector import ScriptDetector
|
8
7
|
from .language_detector import LanguageDetector
|
8
|
+
from .script_detector import ScriptDetector
|
9
9
|
|
10
10
|
__all__ = [
|
11
11
|
'ScriptDetector',
|
@@ -5,17 +5,18 @@ Auto-configuring translation service with language detection and JSON support.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import
|
8
|
+
from typing import Any, Dict, Optional
|
9
9
|
|
10
10
|
from django_cfg.modules import BaseCfgModule
|
11
|
+
|
11
12
|
from ..llm.client import LLMClient
|
12
13
|
from .cache import TranslationCacheManager
|
13
14
|
|
14
15
|
# Import specialized components
|
15
|
-
from .detectors import
|
16
|
-
from .translators import TextTranslator, JsonTranslator, TranslationError, LanguageDetectionError
|
17
|
-
from .utils import TextUtils, PromptBuilder
|
16
|
+
from .detectors import LanguageDetector, ScriptDetector
|
18
17
|
from .stats import StatsTracker
|
18
|
+
from .translators import JsonTranslator, TextTranslator, TranslationError
|
19
|
+
from .utils import PromptBuilder, TextUtils
|
19
20
|
|
20
21
|
logger = logging.getLogger(__name__)
|
21
22
|
|
@@ -4,8 +4,8 @@ Translation modules.
|
|
4
4
|
Text and JSON translation with caching and batch processing.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from .text_translator import TextTranslator, TranslationError, LanguageDetectionError
|
8
7
|
from .json_translator import JsonTranslator
|
8
|
+
from .text_translator import LanguageDetectionError, TextTranslator, TranslationError
|
9
9
|
|
10
10
|
__all__ = [
|
11
11
|
'TextTranslator',
|
@@ -6,28 +6,27 @@ KISS principle: simple, unified logging configuration.
|
|
6
6
|
|
7
7
|
import logging
|
8
8
|
from pathlib import Path
|
9
|
-
from typing import Dict
|
9
|
+
from typing import Dict
|
10
10
|
|
11
11
|
from ..base import BaseCfgModule
|
12
|
-
from ...utils.smart_defaults import get_log_filename
|
13
12
|
|
14
13
|
|
15
14
|
class DjangoLogger(BaseCfgModule):
|
16
15
|
"""Simple auto-configuring logger."""
|
17
|
-
|
16
|
+
|
18
17
|
_loggers: Dict[str, logging.Logger] = {}
|
19
18
|
_configured = False
|
20
|
-
|
19
|
+
|
21
20
|
@classmethod
|
22
21
|
def get_logger(cls, name: str = "django_cfg") -> logging.Logger:
|
23
22
|
"""Get a configured logger instance."""
|
24
23
|
if not cls._configured:
|
25
24
|
cls._setup_logging()
|
26
|
-
|
25
|
+
|
27
26
|
if name not in cls._loggers:
|
28
27
|
cls._loggers[name] = cls._create_logger(name)
|
29
28
|
return cls._loggers[name]
|
30
|
-
|
29
|
+
|
31
30
|
@classmethod
|
32
31
|
def _setup_logging(cls):
|
33
32
|
"""Setup modular logging configuration with separate files per module."""
|
@@ -35,15 +34,15 @@ class DjangoLogger(BaseCfgModule):
|
|
35
34
|
current_dir = Path(os.getcwd())
|
36
35
|
logs_dir = current_dir / 'logs'
|
37
36
|
djangocfg_logs_dir = logs_dir / 'djangocfg'
|
38
|
-
|
37
|
+
|
39
38
|
# Create directories
|
40
39
|
logs_dir.mkdir(parents=True, exist_ok=True)
|
41
40
|
djangocfg_logs_dir.mkdir(parents=True, exist_ok=True)
|
42
|
-
|
41
|
+
|
43
42
|
# print(f"[django-cfg] Setting up modular logging:")
|
44
43
|
# print(f" Django logs: {logs_dir / 'django.log'}")
|
45
44
|
# print(f" Django-CFG logs: {djangocfg_logs_dir}/")
|
46
|
-
|
45
|
+
|
47
46
|
# Get debug mode
|
48
47
|
try:
|
49
48
|
from django_cfg.core.state import get_current_config
|
@@ -51,7 +50,7 @@ class DjangoLogger(BaseCfgModule):
|
|
51
50
|
debug = config.debug if config else False
|
52
51
|
except Exception:
|
53
52
|
debug = os.getenv('DEBUG', 'false').lower() in ('true', '1', 'yes')
|
54
|
-
|
53
|
+
|
55
54
|
# Create handlers
|
56
55
|
try:
|
57
56
|
# Handler for general Django logs
|
@@ -71,17 +70,17 @@ class DjangoLogger(BaseCfgModule):
|
|
71
70
|
# Configure root logger
|
72
71
|
root_logger = logging.getLogger()
|
73
72
|
root_logger.setLevel(logging.DEBUG if debug else logging.WARNING)
|
74
|
-
|
73
|
+
|
75
74
|
# Clear existing handlers
|
76
75
|
root_logger.handlers.clear()
|
77
|
-
|
76
|
+
|
78
77
|
# Add handlers to root logger
|
79
78
|
root_logger.addHandler(console_handler)
|
80
79
|
root_logger.addHandler(django_handler) # All logs go to django.log
|
81
|
-
|
80
|
+
|
82
81
|
# print(f"[django-cfg] Modular logging configured successfully! Debug: {debug}")
|
83
82
|
cls._configured = True
|
84
|
-
|
83
|
+
|
85
84
|
except Exception as e:
|
86
85
|
print(f"[django-cfg] ERROR setting up modular logging: {e}")
|
87
86
|
# Fallback to console only
|
@@ -92,12 +91,12 @@ class DjangoLogger(BaseCfgModule):
|
|
92
91
|
force=True
|
93
92
|
)
|
94
93
|
cls._configured = True
|
95
|
-
|
94
|
+
|
96
95
|
@classmethod
|
97
96
|
def _create_logger(cls, name: str) -> logging.Logger:
|
98
97
|
"""Create logger with modular file handling for django-cfg loggers."""
|
99
98
|
logger = logging.getLogger(name)
|
100
|
-
|
99
|
+
|
101
100
|
# If this is a django-cfg logger, add a specific file handler
|
102
101
|
if name.startswith('django_cfg'):
|
103
102
|
try:
|
@@ -105,7 +104,7 @@ class DjangoLogger(BaseCfgModule):
|
|
105
104
|
current_dir = Path(os.getcwd())
|
106
105
|
djangocfg_logs_dir = current_dir / 'logs' / 'djangocfg'
|
107
106
|
djangocfg_logs_dir.mkdir(parents=True, exist_ok=True)
|
108
|
-
|
107
|
+
|
109
108
|
# Extract module name from logger name
|
110
109
|
# e.g., 'django_cfg.payments.provider' -> 'payments'
|
111
110
|
# e.g., 'django_cfg.core' -> 'core'
|
@@ -115,12 +114,12 @@ class DjangoLogger(BaseCfgModule):
|
|
115
114
|
module_name = parts[1] # django_cfg.payments -> payments
|
116
115
|
else:
|
117
116
|
module_name = 'core' # django_cfg -> core
|
118
|
-
|
117
|
+
|
119
118
|
log_file_path = djangocfg_logs_dir / f'{module_name}.log'
|
120
|
-
|
119
|
+
|
121
120
|
# Create file handler for this specific module
|
122
121
|
file_handler = logging.FileHandler(log_file_path, encoding='utf-8')
|
123
|
-
|
122
|
+
|
124
123
|
# Get debug mode
|
125
124
|
try:
|
126
125
|
from django_cfg.core.state import get_current_config
|
@@ -130,20 +129,20 @@ class DjangoLogger(BaseCfgModule):
|
|
130
129
|
debug = os.getenv('DEBUG', 'false').lower() in ('true', '1', 'yes')
|
131
130
|
|
132
131
|
file_handler.setLevel(logging.DEBUG if debug else logging.WARNING)
|
133
|
-
|
132
|
+
|
134
133
|
# Set format
|
135
134
|
formatter = logging.Formatter('[%(asctime)s] %(levelname)s in %(name)s [%(filename)s:%(lineno)d]: %(message)s')
|
136
135
|
file_handler.setFormatter(formatter)
|
137
|
-
|
136
|
+
|
138
137
|
# Add handler to logger
|
139
138
|
logger.addHandler(file_handler)
|
140
139
|
logger.propagate = True # Also send to parent (django.log)
|
141
|
-
|
140
|
+
|
142
141
|
# print(f"[django-cfg] Created modular logger: {name} -> {log_file_path}")
|
143
|
-
|
142
|
+
|
144
143
|
except Exception as e:
|
145
144
|
print(f"[django-cfg] ERROR creating modular logger for {name}: {e}")
|
146
|
-
|
145
|
+
|
147
146
|
return logger
|
148
147
|
|
149
148
|
|
@@ -155,7 +154,7 @@ def get_logger(name: str = "django_cfg") -> logging.Logger:
|
|
155
154
|
If called from django-cfg modules, automatically prefixes with 'django_cfg.'
|
156
155
|
"""
|
157
156
|
import inspect
|
158
|
-
|
157
|
+
|
159
158
|
# Auto-detect if we're being called from django-cfg code
|
160
159
|
if not name.startswith('django_cfg'):
|
161
160
|
# Get the calling frame to determine if we're in django-cfg code
|
@@ -165,17 +164,17 @@ def get_logger(name: str = "django_cfg") -> logging.Logger:
|
|
165
164
|
caller_frame = frame.f_back
|
166
165
|
if caller_frame:
|
167
166
|
caller_filename = caller_frame.f_code.co_filename
|
168
|
-
|
167
|
+
|
169
168
|
# Check if caller is from django-cfg modules
|
170
169
|
if '/django_cfg/' in caller_filename:
|
171
170
|
# Extract module path from filename
|
172
171
|
# e.g., /path/to/django_cfg/apps/payments/services/providers/registry.py
|
173
172
|
# -> django_cfg.payments.providers
|
174
|
-
|
173
|
+
|
175
174
|
parts = caller_filename.split('/django_cfg/')
|
176
175
|
if len(parts) > 1:
|
177
176
|
module_path = parts[1] # apps/payments/services/providers/registry.py
|
178
|
-
|
177
|
+
|
179
178
|
# Convert path to module name
|
180
179
|
if module_path.startswith('apps/'):
|
181
180
|
# apps/payments/services/providers/registry.py -> payments.providers
|
@@ -186,24 +185,24 @@ def get_logger(name: str = "django_cfg") -> logging.Logger:
|
|
186
185
|
for part in path_parts[:-1]: # Exclude filename
|
187
186
|
if part not in ['services', 'management', 'commands']:
|
188
187
|
clean_parts.append(part)
|
189
|
-
|
188
|
+
|
190
189
|
if clean_parts:
|
191
190
|
auto_name = f"django_cfg.{'.'.join(clean_parts)}"
|
192
191
|
# print(f"[django-cfg] Auto-detected logger name: {name} -> {auto_name}")
|
193
192
|
name = auto_name
|
194
|
-
|
193
|
+
|
195
194
|
elif module_path.startswith('modules/'):
|
196
195
|
# modules/django_logger.py -> django_cfg.core
|
197
196
|
name = "django_cfg.core"
|
198
|
-
|
197
|
+
|
199
198
|
elif module_path.startswith('core/'):
|
200
199
|
# core/config.py -> django_cfg.core
|
201
200
|
name = "django_cfg.core"
|
202
201
|
finally:
|
203
202
|
del frame
|
204
|
-
|
203
|
+
|
205
204
|
return DjangoLogger.get_logger(name)
|
206
205
|
|
207
206
|
|
208
207
|
# Export public API
|
209
|
-
__all__ = ['DjangoLogger', 'get_logger']
|
208
|
+
__all__ = ['DjangoLogger', 'get_logger']
|
@@ -4,19 +4,15 @@ Centralized Logger for Django Config Toolkit
|
|
4
4
|
Provides configurable logging with different levels and formatters.
|
5
5
|
"""
|
6
6
|
|
7
|
+
import json
|
7
8
|
import logging
|
8
9
|
import os
|
9
10
|
import sys
|
10
|
-
import
|
11
|
-
|
12
|
-
from pathlib import Path
|
11
|
+
from typing import Any, Dict, List, Optional, Union
|
12
|
+
|
13
13
|
import yaml
|
14
14
|
from rich.console import Console
|
15
15
|
from rich.logging import RichHandler
|
16
|
-
from rich.panel import Panel
|
17
|
-
from rich.text import Text
|
18
|
-
from rich.table import Table
|
19
|
-
from rich.syntax import Syntax
|
20
16
|
|
21
17
|
|
22
18
|
class LoggerConfig:
|
@@ -6,19 +6,19 @@ Auto-configuring Ngrok integration for local development.
|
|
6
6
|
|
7
7
|
from .service import (
|
8
8
|
DjangoNgrok,
|
9
|
-
NgrokManager,
|
10
9
|
NgrokError,
|
10
|
+
NgrokManager,
|
11
|
+
get_api_url,
|
12
|
+
get_effective_tunnel_url,
|
13
|
+
get_ngrok_host_from_env,
|
11
14
|
get_ngrok_service,
|
12
|
-
start_tunnel,
|
13
|
-
stop_tunnel,
|
14
15
|
get_tunnel_url,
|
15
|
-
get_webhook_url,
|
16
|
-
get_api_url,
|
17
16
|
get_tunnel_url_from_env,
|
18
|
-
|
17
|
+
get_webhook_url,
|
19
18
|
is_ngrok_available_from_env,
|
20
19
|
is_tunnel_active,
|
21
|
-
|
20
|
+
start_tunnel,
|
21
|
+
stop_tunnel,
|
22
22
|
)
|
23
23
|
|
24
24
|
__all__ = [
|