django-cfg 1.4.21__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/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.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.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.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info ā django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info ā django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -3,15 +3,15 @@ Create Token Command for Django Config Toolkit
|
|
3
3
|
Generate API tokens and authentication tokens.
|
4
4
|
"""
|
5
5
|
|
6
|
-
import os
|
7
6
|
import secrets
|
8
7
|
import string
|
8
|
+
from datetime import datetime, timedelta
|
9
9
|
from pathlib import Path
|
10
|
-
|
11
|
-
from django.contrib.auth import get_user_model
|
12
|
-
from django.conf import settings
|
10
|
+
|
13
11
|
import questionary
|
14
|
-
from
|
12
|
+
from django.contrib.auth import get_user_model
|
13
|
+
from django.core.management.base import BaseCommand
|
14
|
+
|
15
15
|
from django_cfg.modules.django_logging import get_logger
|
16
16
|
|
17
17
|
User = get_user_model()
|
@@ -98,26 +98,26 @@ class Command(BaseCommand):
|
|
98
98
|
def create_api_token(self):
|
99
99
|
"""Create API token"""
|
100
100
|
self.stdout.write(self.style.SUCCESS('š Creating API Token...'))
|
101
|
-
|
101
|
+
|
102
102
|
# Get token details
|
103
103
|
token_name = questionary.text('Token name:').ask()
|
104
104
|
if not token_name:
|
105
105
|
self.stdout.write(self.style.ERROR('ā Token name is required'))
|
106
106
|
return
|
107
|
-
|
107
|
+
|
108
108
|
token_length = questionary.select(
|
109
109
|
'Token length:',
|
110
110
|
choices=['32', '64', '128', '256']
|
111
111
|
).ask()
|
112
|
-
|
112
|
+
|
113
113
|
expires = questionary.select(
|
114
114
|
'Token expiration:',
|
115
115
|
choices=['Never', '30 days', '90 days', '1 year']
|
116
116
|
).ask()
|
117
|
-
|
117
|
+
|
118
118
|
# Generate token
|
119
119
|
token = self.generate_token(int(token_length))
|
120
|
-
|
120
|
+
|
121
121
|
# Calculate expiration
|
122
122
|
expiration_date = None
|
123
123
|
if expires != 'Never':
|
@@ -127,10 +127,10 @@ class Command(BaseCommand):
|
|
127
127
|
'1 year': 365
|
128
128
|
}
|
129
129
|
expiration_date = datetime.now() + timedelta(days=days_map[expires])
|
130
|
-
|
130
|
+
|
131
131
|
# Save token (in a real app, you'd save to database)
|
132
132
|
self.save_token_to_file('api_token', token, token_name, expiration_date)
|
133
|
-
|
133
|
+
|
134
134
|
self.stdout.write(self.style.SUCCESS(f'ā
API Token created: {token}'))
|
135
135
|
self.stdout.write(f'š Name: {token_name}')
|
136
136
|
if expiration_date:
|
@@ -139,86 +139,86 @@ class Command(BaseCommand):
|
|
139
139
|
def create_auth_token(self):
|
140
140
|
"""Create authentication token"""
|
141
141
|
self.stdout.write(self.style.SUCCESS('š Creating Auth Token...'))
|
142
|
-
|
142
|
+
|
143
143
|
# Get token details
|
144
144
|
token_name = questionary.text('Token name:').ask()
|
145
145
|
if not token_name:
|
146
146
|
self.stdout.write(self.style.ERROR('ā Token name is required'))
|
147
147
|
return
|
148
|
-
|
148
|
+
|
149
149
|
token_length = questionary.select(
|
150
150
|
'Token length:',
|
151
151
|
choices=['32', '64', '128']
|
152
152
|
).ask()
|
153
|
-
|
153
|
+
|
154
154
|
# Generate token
|
155
155
|
token = self.generate_token(int(token_length))
|
156
|
-
|
156
|
+
|
157
157
|
# Save token
|
158
158
|
self.save_token_to_file('auth_token', token, token_name)
|
159
|
-
|
159
|
+
|
160
160
|
self.stdout.write(self.style.SUCCESS(f'ā
Auth Token created: {token}'))
|
161
161
|
self.stdout.write(f'š Name: {token_name}')
|
162
162
|
|
163
163
|
def create_secret_key(self):
|
164
164
|
"""Create secret key"""
|
165
165
|
self.stdout.write(self.style.SUCCESS('š Creating Secret Key...'))
|
166
|
-
|
166
|
+
|
167
167
|
# Get key details
|
168
168
|
key_name = questionary.text('Secret key name:').ask()
|
169
169
|
if not key_name:
|
170
170
|
self.stdout.write(self.style.ERROR('ā Key name is required'))
|
171
171
|
return
|
172
|
-
|
172
|
+
|
173
173
|
key_length = questionary.select(
|
174
174
|
'Key length:',
|
175
175
|
choices=['32', '64', '128', '256']
|
176
176
|
).ask()
|
177
|
-
|
177
|
+
|
178
178
|
# Generate secret key
|
179
179
|
secret_key = self.generate_secret_key(int(key_length))
|
180
|
-
|
180
|
+
|
181
181
|
# Save key
|
182
182
|
self.save_token_to_file('secret_key', secret_key, key_name)
|
183
|
-
|
183
|
+
|
184
184
|
self.stdout.write(self.style.SUCCESS(f'ā
Secret Key created: {secret_key}'))
|
185
185
|
self.stdout.write(f'š Name: {key_name}')
|
186
186
|
|
187
187
|
def create_token_for_user_interactive(self):
|
188
188
|
"""Create token for user interactively"""
|
189
189
|
self.stdout.write(self.style.SUCCESS('š¤ Creating Token for User...'))
|
190
|
-
|
190
|
+
|
191
191
|
# Get user
|
192
192
|
username = questionary.text('Username:').ask()
|
193
193
|
if not username:
|
194
194
|
self.stdout.write(self.style.ERROR('ā Username is required'))
|
195
195
|
return
|
196
|
-
|
196
|
+
|
197
197
|
# Check if user exists
|
198
198
|
try:
|
199
199
|
user = User.objects.get(username=username)
|
200
200
|
except User.DoesNotExist:
|
201
201
|
self.stdout.write(self.style.ERROR(f'ā User {username} does not exist'))
|
202
202
|
return
|
203
|
-
|
203
|
+
|
204
204
|
# Get token type
|
205
205
|
token_type = questionary.select(
|
206
206
|
'Token type:',
|
207
207
|
choices=['API Token', 'Auth Token', 'Secret Key']
|
208
208
|
).ask()
|
209
|
-
|
209
|
+
|
210
210
|
# Get token length
|
211
211
|
token_length = questionary.select(
|
212
212
|
'Token length:',
|
213
213
|
choices=['32', '64', '128']
|
214
214
|
).ask()
|
215
|
-
|
215
|
+
|
216
216
|
# Get expiration
|
217
217
|
expires = questionary.select(
|
218
218
|
'Token expiration:',
|
219
219
|
choices=['Never', '30 days', '90 days', '1 year']
|
220
220
|
).ask()
|
221
|
-
|
221
|
+
|
222
222
|
# Create token
|
223
223
|
self.create_token_for_user(
|
224
224
|
username=username,
|
@@ -238,22 +238,22 @@ class Command(BaseCommand):
|
|
238
238
|
except User.DoesNotExist:
|
239
239
|
self.stdout.write(self.style.ERROR(f'ā User {username} does not exist'))
|
240
240
|
return
|
241
|
-
|
241
|
+
|
242
242
|
# Generate token
|
243
243
|
if token_type == 'secret_key':
|
244
244
|
token = self.generate_secret_key(length)
|
245
245
|
else:
|
246
246
|
token = self.generate_token(length)
|
247
|
-
|
247
|
+
|
248
248
|
# Calculate expiration
|
249
249
|
expiration_date = None
|
250
250
|
if expires_days:
|
251
251
|
expiration_date = datetime.now() + timedelta(days=expires_days)
|
252
|
-
|
252
|
+
|
253
253
|
# Save token
|
254
254
|
token_name = f"{username}_{token_type}_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
|
255
255
|
self.save_token_to_file(token_type, token, token_name, expiration_date, user)
|
256
|
-
|
256
|
+
|
257
257
|
self.stdout.write(self.style.SUCCESS(f'ā
{token_type.title()} created for {username}'))
|
258
258
|
self.stdout.write(f'š Token: {token}')
|
259
259
|
self.stdout.write(f'š Name: {token_name}')
|
@@ -263,13 +263,13 @@ class Command(BaseCommand):
|
|
263
263
|
def generate_django_secret_key(self):
|
264
264
|
"""Generate Django secret key"""
|
265
265
|
self.stdout.write(self.style.SUCCESS('š Generating Django Secret Key...'))
|
266
|
-
|
266
|
+
|
267
267
|
# Generate Django-compatible secret key
|
268
268
|
secret_key = self.generate_django_secret()
|
269
|
-
|
269
|
+
|
270
270
|
# Save to file
|
271
271
|
self.save_token_to_file('django_secret', secret_key, 'django_secret_key')
|
272
|
-
|
272
|
+
|
273
273
|
self.stdout.write(self.style.SUCCESS(f'ā
Django Secret Key generated: {secret_key}'))
|
274
274
|
self.stdout.write('š” Add this to your .env file as SECRET_KEY=...')
|
275
275
|
|
@@ -294,12 +294,12 @@ class Command(BaseCommand):
|
|
294
294
|
# Create tokens directory
|
295
295
|
tokens_dir = Path('tokens')
|
296
296
|
tokens_dir.mkdir(exist_ok=True)
|
297
|
-
|
297
|
+
|
298
298
|
# Create token file
|
299
299
|
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
|
300
300
|
filename = f"{token_type}_{name}_{timestamp}.txt"
|
301
301
|
filepath = tokens_dir / filename
|
302
|
-
|
302
|
+
|
303
303
|
with open(filepath, 'w') as f:
|
304
304
|
f.write(f"Token Type: {token_type}\n")
|
305
305
|
f.write(f"Name: {name}\n")
|
@@ -309,20 +309,20 @@ class Command(BaseCommand):
|
|
309
309
|
f.write(f"Expires: {expiration_date.strftime('%Y-%m-%d %H:%M:%S')}\n")
|
310
310
|
if user:
|
311
311
|
f.write(f"User: {user.username} ({user.email})\n")
|
312
|
-
f.write(
|
312
|
+
f.write("\n# Add to your configuration:\n")
|
313
313
|
f.write(f"# {token_type.upper()}_KEY={token}\n")
|
314
|
-
|
314
|
+
|
315
315
|
self.stdout.write(f'š¾ Token saved to: {filepath}')
|
316
|
-
|
316
|
+
|
317
317
|
# Also save to .env format
|
318
318
|
env_filename = f"{token_type}_{name}_{timestamp}.env"
|
319
319
|
env_filepath = tokens_dir / env_filename
|
320
|
-
|
320
|
+
|
321
321
|
with open(env_filepath, 'w') as f:
|
322
322
|
f.write(f"# {token_type.title()} - {name}\n")
|
323
323
|
f.write(f"# Created: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
|
324
324
|
if expiration_date:
|
325
325
|
f.write(f"# Expires: {expiration_date.strftime('%Y-%m-%d %H:%M:%S')}\n")
|
326
326
|
f.write(f"{token_type.upper()}_KEY={token}\n")
|
327
|
-
|
327
|
+
|
328
328
|
self.stdout.write(f'š¾ Environment file saved to: {env_filepath}')
|
@@ -6,21 +6,20 @@ Useful for development and webhook configuration.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
import re
|
9
|
+
|
10
|
+
from django.conf import settings
|
9
11
|
from django.core.management.base import BaseCommand
|
10
12
|
from django.urls import get_resolver
|
11
|
-
from
|
12
|
-
from django_cfg.modules.django_logging import get_logger
|
13
|
-
|
13
|
+
from rich.align import Align
|
14
14
|
|
15
15
|
# Rich imports for beautiful output
|
16
16
|
from rich.console import Console
|
17
17
|
from rich.panel import Panel
|
18
|
-
from rich.text import Text
|
19
18
|
from rich.table import Table
|
20
|
-
from rich.
|
19
|
+
from rich.text import Text
|
21
20
|
|
22
21
|
from django_cfg.core.state import get_current_config
|
23
|
-
|
22
|
+
from django_cfg.modules.django_logging import get_logger
|
24
23
|
|
25
24
|
logger = get_logger('list_urls')
|
26
25
|
|
@@ -33,7 +32,7 @@ class Command(BaseCommand):
|
|
33
32
|
is_destructive = False
|
34
33
|
|
35
34
|
help = "Display all available URLs with Rich formatting"
|
36
|
-
|
35
|
+
|
37
36
|
def __init__(self, *args, **kwargs):
|
38
37
|
super().__init__(*args, **kwargs)
|
39
38
|
self.console = Console()
|
@@ -81,10 +80,10 @@ class Command(BaseCommand):
|
|
81
80
|
# Filter URLs
|
82
81
|
if filter_str:
|
83
82
|
urls = [url for url in urls if filter_str.lower() in url['pattern'].lower()]
|
84
|
-
|
83
|
+
|
85
84
|
if webhook_only:
|
86
85
|
urls = [url for url in urls if 'webhook' in url['pattern'].lower() or 'hook' in url['pattern'].lower()]
|
87
|
-
|
86
|
+
|
88
87
|
if api_only:
|
89
88
|
urls = [url for url in urls if '/api/' in url['pattern'] or url['pattern'].startswith('api/')]
|
90
89
|
|
@@ -99,14 +98,14 @@ class Command(BaseCommand):
|
|
99
98
|
"""Show beautiful header with Rich."""
|
100
99
|
title = Text("Django URLs Overview", style="bold cyan")
|
101
100
|
subtitle = Text("All available URLs in your project", style="dim")
|
102
|
-
|
101
|
+
|
103
102
|
header_content = Align.center(
|
104
103
|
Text.assemble(
|
105
104
|
title, "\n",
|
106
105
|
subtitle
|
107
106
|
)
|
108
107
|
)
|
109
|
-
|
108
|
+
|
110
109
|
self.console.print()
|
111
110
|
self.console.print(Panel(
|
112
111
|
header_content,
|
@@ -127,7 +126,7 @@ class Command(BaseCommand):
|
|
127
126
|
"""Extract all URLs from Django URL configuration."""
|
128
127
|
urls = []
|
129
128
|
resolver = get_resolver()
|
130
|
-
|
129
|
+
|
131
130
|
def extract_urls(url_patterns, prefix=''):
|
132
131
|
for pattern in url_patterns:
|
133
132
|
if hasattr(pattern, 'url_patterns'):
|
@@ -137,15 +136,15 @@ class Command(BaseCommand):
|
|
137
136
|
else:
|
138
137
|
# This is a regular URL pattern
|
139
138
|
full_pattern = prefix + str(pattern.pattern)
|
140
|
-
|
139
|
+
|
141
140
|
# Clean up the pattern
|
142
141
|
clean_pattern = re.sub(r'\^|\$', '', full_pattern)
|
143
142
|
clean_pattern = re.sub(r'\\/', '/', clean_pattern)
|
144
|
-
|
143
|
+
|
145
144
|
# Get view info
|
146
145
|
view_name = getattr(pattern, 'name', None)
|
147
146
|
view_func = getattr(pattern, 'callback', None)
|
148
|
-
|
147
|
+
|
149
148
|
if view_func:
|
150
149
|
if hasattr(view_func, 'view_class'):
|
151
150
|
# Class-based view
|
@@ -161,14 +160,14 @@ class Command(BaseCommand):
|
|
161
160
|
else:
|
162
161
|
view_info = 'Unknown'
|
163
162
|
module = 'unknown'
|
164
|
-
|
163
|
+
|
165
164
|
urls.append({
|
166
165
|
'pattern': clean_pattern,
|
167
166
|
'name': view_name,
|
168
167
|
'view': view_info,
|
169
168
|
'module': module
|
170
169
|
})
|
171
|
-
|
170
|
+
|
172
171
|
extract_urls(resolver.url_patterns)
|
173
172
|
return urls
|
174
173
|
|
@@ -183,7 +182,7 @@ class Command(BaseCommand):
|
|
183
182
|
table.add_column("URL Pattern", style="cyan", width=40)
|
184
183
|
table.add_column("Name", style="white", width=20)
|
185
184
|
table.add_column("View", style="green", width=25)
|
186
|
-
|
185
|
+
|
187
186
|
if with_ngrok:
|
188
187
|
table.add_column("Ngrok URL", style="magenta", width=40)
|
189
188
|
|
@@ -196,20 +195,20 @@ class Command(BaseCommand):
|
|
196
195
|
pattern = url['pattern']
|
197
196
|
name = url['name'] or 'ā'
|
198
197
|
view = url['view']
|
199
|
-
|
198
|
+
|
200
199
|
# Truncate long view names
|
201
200
|
if len(view) > 23:
|
202
201
|
view = view[:20] + "..."
|
203
|
-
|
202
|
+
|
204
203
|
row = [pattern, name, view]
|
205
|
-
|
204
|
+
|
206
205
|
if with_ngrok:
|
207
206
|
if ngrok_url:
|
208
207
|
full_ngrok_url = f"{ngrok_url.rstrip('/')}/{pattern.lstrip('/')}"
|
209
208
|
row.append(full_ngrok_url)
|
210
209
|
else:
|
211
210
|
row.append("ā")
|
212
|
-
|
211
|
+
|
213
212
|
table.add_row(*row)
|
214
213
|
|
215
214
|
if len(urls) > 50:
|
@@ -221,47 +220,47 @@ class Command(BaseCommand):
|
|
221
220
|
info_table = Table(show_header=False, box=None)
|
222
221
|
info_table.add_column("Info", style="cyan")
|
223
222
|
info_table.add_column("Value", style="white")
|
224
|
-
|
223
|
+
|
225
224
|
info_table.add_row("š Base URL:", base_url)
|
226
225
|
if with_ngrok and ngrok_url:
|
227
226
|
info_table.add_row("š Ngrok URL:", ngrok_url)
|
228
|
-
|
227
|
+
|
229
228
|
self.console.print()
|
230
229
|
self.console.print(info_table)
|
231
230
|
|
232
231
|
def show_webhook_info(self):
|
233
232
|
"""Show webhook-specific information using reverse."""
|
234
233
|
self.console.print()
|
235
|
-
|
234
|
+
|
236
235
|
webhook_table = Table(title="š Webhook Configuration", show_header=True, header_style="bold yellow")
|
237
236
|
webhook_table.add_column("Service", style="white", width=25)
|
238
237
|
webhook_table.add_column("Local URL", style="cyan", width=60)
|
239
238
|
webhook_table.add_column("Ngrok URL", style="magenta", width=60)
|
240
|
-
|
239
|
+
|
241
240
|
base_url = self.get_base_url()
|
242
241
|
ngrok_url = self.get_ngrok_url()
|
243
|
-
|
242
|
+
|
244
243
|
# Get webhook URLs using reverse
|
245
244
|
try:
|
246
245
|
from django.urls import reverse
|
247
|
-
|
246
|
+
|
248
247
|
# Common webhook endpoints with their URL names
|
249
248
|
webhooks = [
|
250
249
|
("Twilio Message Status", "cfg_accounts:webhook-message-status"),
|
251
250
|
("Twilio Verification", "cfg_accounts:webhook-verification-status"),
|
252
251
|
]
|
253
|
-
|
252
|
+
|
254
253
|
for service, url_name in webhooks:
|
255
254
|
try:
|
256
255
|
# Get the reversed URL path
|
257
256
|
url_path = reverse(url_name)
|
258
|
-
|
257
|
+
|
259
258
|
# Build full URLs
|
260
259
|
local_full = f"{base_url.rstrip('/')}{url_path}"
|
261
260
|
ngrok_full = f"{ngrok_url.rstrip('/')}{url_path}" if ngrok_url else "ā"
|
262
|
-
|
261
|
+
|
263
262
|
webhook_table.add_row(service, local_full, ngrok_full)
|
264
|
-
|
263
|
+
|
265
264
|
except Exception as e:
|
266
265
|
# Fallback if reverse fails
|
267
266
|
self.console.print(f"[yellow]ā ļø Could not reverse URL for {service}: {e}[/yellow]")
|
@@ -269,28 +268,28 @@ class Command(BaseCommand):
|
|
269
268
|
local_full = f"{base_url.rstrip('/')}{fallback_path}"
|
270
269
|
ngrok_full = f"{ngrok_url.rstrip('/')}{fallback_path}" if ngrok_url else "ā"
|
271
270
|
webhook_table.add_row(service, local_full, ngrok_full)
|
272
|
-
|
271
|
+
|
273
272
|
except ImportError:
|
274
273
|
# Fallback if Django is not available
|
275
274
|
webhooks = [
|
276
275
|
("Twilio Message Status", "/api/accounts/webhook/message-status/"),
|
277
276
|
("Twilio Verification", "/api/accounts/webhook/verification-status/"),
|
278
277
|
]
|
279
|
-
|
278
|
+
|
280
279
|
for service, endpoint in webhooks:
|
281
280
|
local_full = f"{base_url.rstrip('/')}{endpoint}"
|
282
281
|
ngrok_full = f"{ngrok_url.rstrip('/')}{endpoint}" if ngrok_url else "ā"
|
283
282
|
webhook_table.add_row(service, local_full, ngrok_full)
|
284
|
-
|
283
|
+
|
285
284
|
self.console.print(webhook_table)
|
286
|
-
|
285
|
+
|
287
286
|
# Show tips
|
288
287
|
tips = [
|
289
288
|
"š” Use ngrok URLs for webhook configuration in production services",
|
290
289
|
"š Always validate webhook signatures in production",
|
291
290
|
"š Test webhooks using the test_twilio management command",
|
292
291
|
]
|
293
|
-
|
292
|
+
|
294
293
|
for tip in tips:
|
295
294
|
self.console.print(f"[dim]{tip}[/dim]")
|
296
295
|
|
@@ -310,4 +309,4 @@ class Command(BaseCommand):
|
|
310
309
|
"""Get ngrok URL if available."""
|
311
310
|
if self.config:
|
312
311
|
return self.config.get_ngrok_url()
|
313
|
-
return None
|
312
|
+
return None
|
@@ -3,14 +3,12 @@ Simple Migration Command for Django Config Toolkit
|
|
3
3
|
Migrate all databases based on django-cfg configuration.
|
4
4
|
"""
|
5
5
|
|
6
|
-
from django.core.management.base import BaseCommand
|
7
|
-
from django.core.management import call_command
|
8
6
|
from django.apps import apps
|
9
|
-
from
|
10
|
-
|
7
|
+
from django.core.management import call_command
|
8
|
+
from django.core.management.base import BaseCommand
|
11
9
|
|
12
10
|
from django_cfg.core.state import get_current_config
|
13
|
-
|
11
|
+
from django_cfg.modules.django_logging import get_logger
|
14
12
|
|
15
13
|
logger = get_logger('migrate_all')
|
16
14
|
|
@@ -24,8 +22,8 @@ class Command(BaseCommand):
|
|
24
22
|
|
25
23
|
def add_arguments(self, parser):
|
26
24
|
parser.add_argument(
|
27
|
-
"--dry-run",
|
28
|
-
action="store_true",
|
25
|
+
"--dry-run",
|
26
|
+
action="store_true",
|
29
27
|
help="Show what would be migrated without executing"
|
30
28
|
)
|
31
29
|
parser.add_argument(
|
@@ -39,10 +37,10 @@ class Command(BaseCommand):
|
|
39
37
|
logger.info("Starting migrate_all command")
|
40
38
|
dry_run = options.get("dry_run", False)
|
41
39
|
skip_makemigrations = options.get("skip_makemigrations", False)
|
42
|
-
|
40
|
+
|
43
41
|
if dry_run:
|
44
42
|
self.stdout.write(self.style.WARNING("š DRY RUN - No changes will be made"))
|
45
|
-
|
43
|
+
|
46
44
|
self.stdout.write(self.style.SUCCESS("š Migrating all databases..."))
|
47
45
|
|
48
46
|
# Step 1: Create migrations if needed
|
@@ -66,7 +64,7 @@ class Command(BaseCommand):
|
|
66
64
|
# Step 3: Migrate each database
|
67
65
|
for db_name, db_config in config.databases.items():
|
68
66
|
self.stdout.write(f"\nš Migrating database: {db_name}")
|
69
|
-
|
67
|
+
|
70
68
|
if hasattr(db_config, 'apps') and db_config.apps:
|
71
69
|
# Migrate specific apps for this database
|
72
70
|
for app_path in db_config.apps:
|
@@ -84,7 +82,7 @@ class Command(BaseCommand):
|
|
84
82
|
self.stdout.write(f" Would run: migrate {app_label} --database={db_name}")
|
85
83
|
else:
|
86
84
|
# Migrate all apps for this database (usually default)
|
87
|
-
self.stdout.write(
|
85
|
+
self.stdout.write(" š¦ Migrating all apps...")
|
88
86
|
if not dry_run:
|
89
87
|
try:
|
90
88
|
call_command("migrate", database=db_name, verbosity=1)
|
@@ -96,7 +94,7 @@ class Command(BaseCommand):
|
|
96
94
|
self.stdout.write(f" Would run: migrate --database={db_name}")
|
97
95
|
|
98
96
|
# Step 4: Migrate constance if needed
|
99
|
-
self.stdout.write(
|
97
|
+
self.stdout.write("\nš§ Migrating constance...")
|
100
98
|
if not dry_run:
|
101
99
|
try:
|
102
100
|
call_command("migrate", "constance", database="default", verbosity=1)
|
@@ -118,7 +116,7 @@ class Command(BaseCommand):
|
|
118
116
|
return app_config.label
|
119
117
|
except LookupError:
|
120
118
|
pass
|
121
|
-
|
119
|
+
|
122
120
|
# Fallback: extract last part of the path as potential app_label
|
123
121
|
potential_label = app_path.split('.')[-1]
|
124
122
|
try:
|
@@ -126,8 +124,8 @@ class Command(BaseCommand):
|
|
126
124
|
return app_config.label
|
127
125
|
except LookupError:
|
128
126
|
pass
|
129
|
-
|
127
|
+
|
130
128
|
return app_path
|
131
|
-
|
129
|
+
|
132
130
|
except Exception:
|
133
131
|
return app_path
|
@@ -3,16 +3,16 @@ Smart Migration Command for Django Config Toolkit
|
|
3
3
|
Simple and reliable migration for all databases.
|
4
4
|
"""
|
5
5
|
|
6
|
-
import os
|
7
6
|
from pathlib import Path
|
8
|
-
|
9
|
-
|
7
|
+
|
8
|
+
import questionary
|
10
9
|
from django.apps import apps
|
10
|
+
from django.conf import settings
|
11
|
+
from django.core.management import call_command
|
12
|
+
from django.core.management.base import BaseCommand
|
11
13
|
from django.db import connections
|
12
14
|
from django.db.migrations.recorder import MigrationRecorder
|
13
|
-
|
14
|
-
import questionary
|
15
|
-
from datetime import datetime
|
15
|
+
|
16
16
|
from django_cfg.core.config import DEFAULT_APPS
|
17
17
|
from django_cfg.modules.django_logging import get_logger
|
18
18
|
|
@@ -104,7 +104,7 @@ class Command(BaseCommand):
|
|
104
104
|
|
105
105
|
# Run full migration
|
106
106
|
self.run_full_migration()
|
107
|
-
|
107
|
+
|
108
108
|
# Always migrate constance (required for django-cfg)
|
109
109
|
self.migrate_constance_if_needed()
|
110
110
|
|
@@ -115,7 +115,7 @@ class Command(BaseCommand):
|
|
115
115
|
try:
|
116
116
|
# First try global makemigrations
|
117
117
|
call_command("makemigrations", verbosity=1)
|
118
|
-
|
118
|
+
|
119
119
|
# Then try for each app that has models but no migrations
|
120
120
|
all_apps = self.get_all_installed_apps()
|
121
121
|
for app in all_apps:
|
@@ -125,7 +125,7 @@ class Command(BaseCommand):
|
|
125
125
|
call_command("makemigrations", app, verbosity=1)
|
126
126
|
except Exception as e:
|
127
127
|
self.stdout.write(self.style.WARNING(f" ā ļø Could not create migrations for {app}: {e}"))
|
128
|
-
|
128
|
+
|
129
129
|
self.stdout.write(self.style.SUCCESS("ā
Migrations created"))
|
130
130
|
except Exception as e:
|
131
131
|
self.stdout.write(self.style.WARNING(f"ā ļø Warning creating migrations: {e}"))
|
@@ -177,7 +177,7 @@ class Command(BaseCommand):
|
|
177
177
|
# Check if constance is in INSTALLED_APPS
|
178
178
|
if 'constance' in settings.INSTALLED_APPS:
|
179
179
|
self.stdout.write(self.style.SUCCESS("š§ Migrating constance (django-cfg requirement)..."))
|
180
|
-
|
180
|
+
|
181
181
|
# Try to migrate constance on default database
|
182
182
|
try:
|
183
183
|
call_command("migrate", "constance", database="default", verbosity=1)
|
@@ -186,7 +186,7 @@ class Command(BaseCommand):
|
|
186
186
|
self._raise_system_exit(f"Constance migration failed: {e}")
|
187
187
|
else:
|
188
188
|
self.stdout.write(self.style.WARNING("ā ļø Constance not found in INSTALLED_APPS"))
|
189
|
-
|
189
|
+
|
190
190
|
except Exception as e:
|
191
191
|
self._raise_system_exit(f"Could not migrate constance: {e}")
|
192
192
|
|
@@ -225,7 +225,7 @@ class Command(BaseCommand):
|
|
225
225
|
try:
|
226
226
|
with connections[db_name].cursor() as cursor:
|
227
227
|
cursor.execute("SELECT 1")
|
228
|
-
self.stdout.write(
|
228
|
+
self.stdout.write(" ā
Connection: OK")
|
229
229
|
except Exception as e:
|
230
230
|
self.stdout.write(f" ā Connection: FAILED - {e}")
|
231
231
|
|
@@ -234,7 +234,7 @@ class Command(BaseCommand):
|
|
234
234
|
if apps:
|
235
235
|
self.stdout.write(f' š¦ Apps: {", ".join(apps)}')
|
236
236
|
else:
|
237
|
-
self.stdout.write(
|
237
|
+
self.stdout.write(" š¦ Apps: None configured")
|
238
238
|
|
239
239
|
def show_config_info(self):
|
240
240
|
"""Show Django configuration information"""
|
@@ -256,18 +256,18 @@ class Command(BaseCommand):
|
|
256
256
|
|
257
257
|
# Multiple databases
|
258
258
|
if len(databases) > 1:
|
259
|
-
self.stdout.write(
|
259
|
+
self.stdout.write("š Multiple Databases: Yes")
|
260
260
|
|
261
261
|
# Show routing rules
|
262
262
|
routing_rules = getattr(settings, "DATABASE_ROUTING_RULES", {})
|
263
263
|
if routing_rules:
|
264
|
-
self.stdout.write(
|
264
|
+
self.stdout.write(" š Routing Rules:")
|
265
265
|
for app, db in routing_rules.items():
|
266
266
|
self.stdout.write(f" - {app} ā {db}")
|
267
267
|
else:
|
268
|
-
self.stdout.write(
|
268
|
+
self.stdout.write(" š Routing Rules: None configured")
|
269
269
|
else:
|
270
|
-
self.stdout.write(
|
270
|
+
self.stdout.write("š Multiple Databases: No")
|
271
271
|
|
272
272
|
# Other settings
|
273
273
|
self.stdout.write(f'š Secret Key: {"*" * 20}...')
|