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
django_cfg/models/api/limits.py
CHANGED
@@ -8,7 +8,8 @@ Following CRITICAL_REQUIREMENTS.md:
|
|
8
8
|
- Simplified configuration with smart defaults
|
9
9
|
"""
|
10
10
|
|
11
|
-
from typing import
|
11
|
+
from typing import Any, Dict, List, Optional
|
12
|
+
|
12
13
|
from pydantic import BaseModel, Field, field_validator, model_validator
|
13
14
|
|
14
15
|
|
@@ -19,13 +20,13 @@ class LimitsConfig(BaseModel):
|
|
19
20
|
All file sizes are specified in megabytes for convenience.
|
20
21
|
Django-cfg handles all the conversion and smart defaults.
|
21
22
|
"""
|
22
|
-
|
23
|
+
|
23
24
|
model_config = {
|
24
25
|
"str_strip_whitespace": True,
|
25
26
|
"validate_assignment": True,
|
26
27
|
"extra": "forbid",
|
27
28
|
}
|
28
|
-
|
29
|
+
|
29
30
|
# File upload limits (in MB)
|
30
31
|
max_upload_mb: float = Field(
|
31
32
|
default=10.0,
|
@@ -33,14 +34,14 @@ class LimitsConfig(BaseModel):
|
|
33
34
|
ge=0.1, # At least 100KB
|
34
35
|
le=1024.0, # Max 1GB
|
35
36
|
)
|
36
|
-
|
37
|
+
|
37
38
|
max_memory_mb: float = Field(
|
38
39
|
default=2.0,
|
39
40
|
description="Maximum size for in-memory file uploads in megabytes",
|
40
41
|
ge=0.1,
|
41
42
|
le=100.0,
|
42
43
|
)
|
43
|
-
|
44
|
+
|
44
45
|
# Request limits (in MB)
|
45
46
|
max_request_mb: float = Field(
|
46
47
|
default=50.0,
|
@@ -48,18 +49,18 @@ class LimitsConfig(BaseModel):
|
|
48
49
|
ge=0.1,
|
49
50
|
le=1024.0,
|
50
51
|
)
|
51
|
-
|
52
|
+
|
52
53
|
# Simple file security
|
53
54
|
allowed_extensions: Optional[List[str]] = Field(
|
54
55
|
default=None,
|
55
56
|
description="List of allowed file extensions (without dots). If None, uses smart defaults.",
|
56
57
|
)
|
57
|
-
|
58
|
+
|
58
59
|
blocked_extensions: Optional[List[str]] = Field(
|
59
60
|
default=None,
|
60
61
|
description="List of blocked file extensions for security. If None, uses smart defaults.",
|
61
62
|
)
|
62
|
-
|
63
|
+
|
63
64
|
# Request timeout
|
64
65
|
request_timeout: int = Field(
|
65
66
|
default=30,
|
@@ -67,40 +68,40 @@ class LimitsConfig(BaseModel):
|
|
67
68
|
ge=1,
|
68
69
|
le=3600,
|
69
70
|
)
|
70
|
-
|
71
|
+
|
71
72
|
# Global settings
|
72
73
|
enabled: bool = Field(
|
73
74
|
default=True,
|
74
75
|
description="Whether limits are enforced",
|
75
76
|
)
|
76
|
-
|
77
|
+
|
77
78
|
strict_mode: bool = Field(
|
78
79
|
default=False,
|
79
80
|
description="Whether to use strict validation (fail on limit violations)",
|
80
81
|
)
|
81
|
-
|
82
|
+
|
82
83
|
@field_validator('allowed_extensions', 'blocked_extensions')
|
83
84
|
@classmethod
|
84
85
|
def validate_extensions(cls, v: Optional[List[str]]) -> Optional[List[str]]:
|
85
86
|
"""Validate file extensions format."""
|
86
87
|
if v is None:
|
87
88
|
return v
|
88
|
-
|
89
|
+
|
89
90
|
validated = []
|
90
91
|
for ext in v:
|
91
92
|
# Remove leading dots and convert to lowercase
|
92
93
|
clean_ext = ext.lstrip('.').lower().strip()
|
93
94
|
if not clean_ext:
|
94
95
|
continue
|
95
|
-
|
96
|
+
|
96
97
|
# Basic validation - only alphanumeric characters
|
97
98
|
if not clean_ext.replace('_', '').replace('-', '').isalnum():
|
98
99
|
raise ValueError(f"Invalid file extension: {ext}")
|
99
|
-
|
100
|
+
|
100
101
|
validated.append(clean_ext)
|
101
|
-
|
102
|
+
|
102
103
|
return validated
|
103
|
-
|
104
|
+
|
104
105
|
@model_validator(mode='after')
|
105
106
|
def validate_limits(self) -> 'LimitsConfig':
|
106
107
|
"""Validate limits consistency."""
|
@@ -109,7 +110,7 @@ class LimitsConfig(BaseModel):
|
|
109
110
|
raise ValueError(
|
110
111
|
"max_memory_mb cannot be larger than max_upload_mb"
|
111
112
|
)
|
112
|
-
|
113
|
+
|
113
114
|
# Check for conflicts between allowed and blocked extensions
|
114
115
|
if self.allowed_extensions and self.blocked_extensions:
|
115
116
|
conflicts = set(self.allowed_extensions) & set(self.blocked_extensions)
|
@@ -117,9 +118,9 @@ class LimitsConfig(BaseModel):
|
|
117
118
|
raise ValueError(
|
118
119
|
f"Extensions cannot be both allowed and blocked: {conflicts}"
|
119
120
|
)
|
120
|
-
|
121
|
+
|
121
122
|
return self
|
122
|
-
|
123
|
+
|
123
124
|
def _get_smart_allowed_extensions(self) -> List[str]:
|
124
125
|
"""Get smart default allowed extensions."""
|
125
126
|
return [
|
@@ -134,7 +135,7 @@ class LimitsConfig(BaseModel):
|
|
134
135
|
# Media
|
135
136
|
"mp3", "mp4", "avi", "mov", "wav",
|
136
137
|
]
|
137
|
-
|
138
|
+
|
138
139
|
def _get_smart_blocked_extensions(self) -> List[str]:
|
139
140
|
"""Get smart default blocked extensions for security."""
|
140
141
|
return [
|
@@ -148,7 +149,7 @@ class LimitsConfig(BaseModel):
|
|
148
149
|
# Potentially dangerous
|
149
150
|
"hta", "reg", "inf", "cab", "cpl",
|
150
151
|
]
|
151
|
-
|
152
|
+
|
152
153
|
def to_django_settings(self) -> Dict[str, Any]:
|
153
154
|
"""
|
154
155
|
Convert limits configuration to Django settings.
|
@@ -158,30 +159,30 @@ class LimitsConfig(BaseModel):
|
|
158
159
|
"""
|
159
160
|
if not self.enabled:
|
160
161
|
return {}
|
161
|
-
|
162
|
+
|
162
163
|
# Convert MB to bytes
|
163
164
|
max_upload_bytes = int(self.max_upload_mb * 1024 * 1024)
|
164
165
|
max_memory_bytes = int(self.max_memory_mb * 1024 * 1024)
|
165
166
|
max_request_bytes = int(self.max_request_mb * 1024 * 1024)
|
166
|
-
|
167
|
+
|
167
168
|
settings = {}
|
168
|
-
|
169
|
+
|
169
170
|
# Core Django file upload settings
|
170
171
|
settings.update({
|
171
172
|
'FILE_UPLOAD_MAX_MEMORY_SIZE': max_memory_bytes,
|
172
173
|
'DATA_UPLOAD_MAX_MEMORY_SIZE': min(max_memory_bytes, max_request_bytes),
|
173
174
|
'DATA_UPLOAD_MAX_NUMBER_FIELDS': 1000, # Reasonable default
|
174
175
|
})
|
175
|
-
|
176
|
+
|
176
177
|
# File extension security
|
177
178
|
allowed_exts = self.allowed_extensions or self._get_smart_allowed_extensions()
|
178
179
|
blocked_exts = self.blocked_extensions or self._get_smart_blocked_extensions()
|
179
|
-
|
180
|
+
|
180
181
|
settings.update({
|
181
182
|
'ALLOWED_FILE_EXTENSIONS': allowed_exts,
|
182
183
|
'BLOCKED_FILE_EXTENSIONS': blocked_exts,
|
183
184
|
})
|
184
|
-
|
185
|
+
|
185
186
|
# Custom settings for middleware/validators
|
186
187
|
settings.update({
|
187
188
|
'LIMITS_CONFIG': {
|
@@ -195,14 +196,14 @@ class LimitsConfig(BaseModel):
|
|
195
196
|
'strict_mode': self.strict_mode,
|
196
197
|
}
|
197
198
|
})
|
198
|
-
|
199
|
+
|
199
200
|
return settings
|
200
|
-
|
201
|
+
|
201
202
|
def get_validator_config(self) -> Dict[str, Any]:
|
202
203
|
"""Get configuration for validation middleware."""
|
203
204
|
allowed_exts = self.allowed_extensions or self._get_smart_allowed_extensions()
|
204
205
|
blocked_exts = self.blocked_extensions or self._get_smart_blocked_extensions()
|
205
|
-
|
206
|
+
|
206
207
|
return {
|
207
208
|
'max_upload_bytes': int(self.max_upload_mb * 1024 * 1024),
|
208
209
|
'max_memory_bytes': int(self.max_memory_mb * 1024 * 1024),
|
django_cfg/models/base/config.py
CHANGED
@@ -6,16 +6,15 @@ Foundation for all Django configuration models using Pydantic 2.
|
|
6
6
|
|
7
7
|
import os
|
8
8
|
from pathlib import Path
|
9
|
-
from typing import
|
9
|
+
from typing import Any, Dict, Optional
|
10
10
|
|
11
|
-
from pydantic import BaseModel, ConfigDict, Field
|
12
11
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
13
12
|
from pydantic_settings.sources import DotEnvSettingsSource
|
14
13
|
|
15
14
|
|
16
15
|
class ConfigValidationError(Exception):
|
17
16
|
"""Configuration validation error with helpful developer messages."""
|
18
|
-
|
17
|
+
|
19
18
|
def __init__(self, field: str, value: Any, message: str):
|
20
19
|
self.field = field
|
21
20
|
self.value = value
|
@@ -34,25 +33,25 @@ class BaseConfig(BaseSettings):
|
|
34
33
|
- Helpful error messages for developers
|
35
34
|
- Environment-specific configuration
|
36
35
|
"""
|
37
|
-
|
36
|
+
|
38
37
|
model_config = SettingsConfigDict(
|
39
38
|
# Environment file settings
|
40
39
|
env_file='.env',
|
41
40
|
env_file_encoding='utf-8',
|
42
41
|
env_nested_delimiter='__',
|
43
42
|
case_sensitive=False,
|
44
|
-
|
43
|
+
|
45
44
|
# Validation settings
|
46
45
|
validate_assignment=True,
|
47
46
|
validate_default=True,
|
48
47
|
extra='ignore',
|
49
|
-
|
48
|
+
|
50
49
|
# Performance settings
|
51
50
|
frozen=False,
|
52
51
|
arbitrary_types_allowed=False,
|
53
52
|
use_enum_values=True,
|
54
53
|
)
|
55
|
-
|
54
|
+
|
56
55
|
@classmethod
|
57
56
|
def settings_customise_sources(
|
58
57
|
cls,
|
@@ -66,11 +65,11 @@ class BaseConfig(BaseSettings):
|
|
66
65
|
env_file = cls._detect_env_file()
|
67
66
|
if env_file:
|
68
67
|
dotenv_settings = DotEnvSettingsSource(
|
69
|
-
settings_cls,
|
68
|
+
settings_cls,
|
70
69
|
env_file=env_file,
|
71
70
|
env_file_encoding='utf-8'
|
72
71
|
)
|
73
|
-
|
72
|
+
|
74
73
|
return (
|
75
74
|
init_settings,
|
76
75
|
env_settings,
|
@@ -85,7 +84,7 @@ class BaseConfig(BaseSettings):
|
|
85
84
|
except Exception as e:
|
86
85
|
self._handle_validation_error(e)
|
87
86
|
raise
|
88
|
-
|
87
|
+
|
89
88
|
@classmethod
|
90
89
|
def _detect_env_file(cls) -> Optional[str]:
|
91
90
|
"""
|
@@ -101,52 +100,52 @@ class BaseConfig(BaseSettings):
|
|
101
100
|
env_files = [
|
102
101
|
'.env.local',
|
103
102
|
'.env.dev',
|
104
|
-
'.env.development',
|
103
|
+
'.env.development',
|
105
104
|
'.env.prod',
|
106
105
|
'.env.production',
|
107
106
|
'config.env.dev',
|
108
107
|
'config.env.prod',
|
109
108
|
'.env'
|
110
109
|
]
|
111
|
-
|
110
|
+
|
112
111
|
for env_file in env_files:
|
113
112
|
if Path(env_file).exists():
|
114
113
|
return env_file
|
115
|
-
|
114
|
+
|
116
115
|
return None
|
117
|
-
|
116
|
+
|
118
117
|
def _show_debug(self) -> bool:
|
119
118
|
"""Check if we should show debug info."""
|
120
119
|
return os.getenv('DEBUG', 'false').lower() in ('true', '1', 'yes')
|
121
|
-
|
120
|
+
|
122
121
|
def _handle_validation_error(self, error: Exception):
|
123
122
|
"""Provide helpful validation error messages for developers."""
|
124
123
|
if hasattr(error, 'errors'):
|
125
124
|
print("❌ Django Configuration Validation Errors:")
|
126
125
|
print("=" * 50)
|
127
|
-
|
126
|
+
|
128
127
|
for err in error.errors():
|
129
128
|
field = '.'.join(str(x) for x in err['loc'])
|
130
129
|
message = err['msg']
|
131
130
|
input_val = err.get('input', 'N/A')
|
132
|
-
|
131
|
+
|
133
132
|
print(f"🔴 Field: {field}")
|
134
133
|
print(f" Error: {message}")
|
135
134
|
print(f" Value: {input_val}")
|
136
|
-
print(
|
135
|
+
print(" 💡 Fix: Check your .env file or environment variables")
|
137
136
|
print()
|
138
|
-
|
137
|
+
|
139
138
|
print("📚 Documentation: https://django-config-toolkit.readthedocs.io/")
|
140
139
|
print("=" * 50)
|
141
|
-
|
140
|
+
|
142
141
|
def to_django_settings(self) -> Dict[str, Any]:
|
143
142
|
"""Convert configuration to Django-compatible settings dictionary."""
|
144
143
|
return self.model_dump(exclude_none=True, by_alias=True)
|
145
|
-
|
144
|
+
|
146
145
|
def get_field_info(self) -> Dict[str, Dict[str, Any]]:
|
147
146
|
"""Get detailed field information for developers."""
|
148
147
|
field_info = {}
|
149
|
-
|
148
|
+
|
150
149
|
for field_name, field in self.model_fields.items():
|
151
150
|
field_info[field_name] = {
|
152
151
|
'description': field.description or f"Configuration for {field_name}",
|
@@ -155,23 +154,23 @@ class BaseConfig(BaseSettings):
|
|
155
154
|
'required': field.is_required(),
|
156
155
|
'env_var': field_name.upper(),
|
157
156
|
}
|
158
|
-
|
157
|
+
|
159
158
|
return field_info
|
160
|
-
|
159
|
+
|
161
160
|
def print_field_help(self):
|
162
161
|
"""Print helpful field information for developers."""
|
163
162
|
print(f"📋 {self.__class__.__name__} Configuration Fields:")
|
164
163
|
print("=" * 60)
|
165
|
-
|
164
|
+
|
166
165
|
for field_name, info in self.get_field_info().items():
|
167
166
|
current_value = getattr(self, field_name, None)
|
168
|
-
|
167
|
+
|
169
168
|
# Hide sensitive values
|
170
169
|
if any(word in field_name.lower() for word in ['secret', 'password', 'key', 'token']):
|
171
170
|
display_value = "***HIDDEN***" if current_value else "Not set"
|
172
171
|
else:
|
173
172
|
display_value = current_value
|
174
|
-
|
173
|
+
|
175
174
|
print(f"🔧 {field_name}:")
|
176
175
|
print(f" 📝 {info['description']}")
|
177
176
|
print(f" 🏷️ Type: {info['type']}")
|
@@ -180,9 +179,9 @@ class BaseConfig(BaseSettings):
|
|
180
179
|
if info['default'] is not None:
|
181
180
|
print(f" 🎯 Default: {info['default']}")
|
182
181
|
if info['required']:
|
183
|
-
print(
|
182
|
+
print(" ⚠️ Required: Yes")
|
184
183
|
print()
|
185
|
-
|
184
|
+
|
186
185
|
@classmethod
|
187
186
|
def create_env_example(cls, filename: str = ".env.example") -> None:
|
188
187
|
"""
|
@@ -199,7 +198,7 @@ class BaseConfig(BaseSettings):
|
|
199
198
|
f"# === {cls.__name__} Configuration ===",
|
200
199
|
"",
|
201
200
|
]
|
202
|
-
|
201
|
+
|
203
202
|
# Create temporary instance to get field info
|
204
203
|
try:
|
205
204
|
temp_instance = cls()
|
@@ -213,11 +212,11 @@ class BaseConfig(BaseSettings):
|
|
213
212
|
'default': field.default if field.default is not ... else None,
|
214
213
|
'env_var': field_name.upper(),
|
215
214
|
}
|
216
|
-
|
215
|
+
|
217
216
|
for field_name, info in field_info.items():
|
218
217
|
# Add description
|
219
218
|
lines.append(f"# {info['description']}")
|
220
|
-
|
219
|
+
|
221
220
|
# Generate example value
|
222
221
|
default_val = info.get('default')
|
223
222
|
if default_val is not None:
|
@@ -241,19 +240,19 @@ class BaseConfig(BaseSettings):
|
|
241
240
|
example_value = "30"
|
242
241
|
else:
|
243
242
|
example_value = "change-me"
|
244
|
-
|
243
|
+
|
245
244
|
# Add environment variable
|
246
245
|
lines.append(f"{info['env_var']}={example_value}")
|
247
246
|
lines.append("")
|
248
|
-
|
247
|
+
|
249
248
|
# Write file
|
250
249
|
with open(filename, 'w', encoding='utf-8') as f:
|
251
250
|
f.write('\n'.join(lines))
|
252
|
-
|
251
|
+
|
253
252
|
print(f"✅ Created example environment file: {filename}")
|
254
|
-
print(
|
255
|
-
print(
|
256
|
-
|
253
|
+
print("💡 Copy it to .env and customize your settings!")
|
254
|
+
print("📚 More info: https://django-config-toolkit.readthedocs.io/")
|
255
|
+
|
257
256
|
def validate_for_environment(self, environment: str = "development") -> bool:
|
258
257
|
"""
|
259
258
|
🧪 Validate configuration for specific environment
|
@@ -275,13 +274,13 @@ class BaseConfig(BaseSettings):
|
|
275
274
|
except Exception as e:
|
276
275
|
print(f"❌ Validation failed for {environment}: {e}")
|
277
276
|
return False
|
278
|
-
|
277
|
+
|
279
278
|
def _validate_production(self) -> bool:
|
280
279
|
"""Validate production-specific requirements."""
|
281
280
|
# Override in subclasses for specific validation
|
282
281
|
return True
|
283
|
-
|
282
|
+
|
284
283
|
def _validate_development(self) -> bool:
|
285
284
|
"""Validate development-specific requirements."""
|
286
|
-
# Override in subclasses for specific validation
|
285
|
+
# Override in subclasses for specific validation
|
287
286
|
return True
|
django_cfg/models/base/module.py
CHANGED
@@ -4,8 +4,8 @@ Base Configuration Module for Django CFG
|
|
4
4
|
Provides a unified base class for all auto-configuration modules.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import Optional, TYPE_CHECKING
|
8
7
|
from abc import ABC, abstractmethod
|
8
|
+
from typing import TYPE_CHECKING, Optional
|
9
9
|
|
10
10
|
if TYPE_CHECKING:
|
11
11
|
from django_cfg.core.config import DjangoConfig
|
@@ -18,7 +18,7 @@ class BaseCfgAutoModule(ABC):
|
|
18
18
|
Provides unified configuration access and smart defaults.
|
19
19
|
Designed to be used in generation.py without circular imports.
|
20
20
|
"""
|
21
|
-
|
21
|
+
|
22
22
|
def __init__(self, config: Optional["DjangoConfig"] = None):
|
23
23
|
"""
|
24
24
|
Initialize the auto-configuration module.
|
@@ -27,7 +27,7 @@ class BaseCfgAutoModule(ABC):
|
|
27
27
|
config: DjangoConfig instance (passed from generation.py)
|
28
28
|
"""
|
29
29
|
self._config = config
|
30
|
-
|
30
|
+
|
31
31
|
def set_config(self, config: "DjangoConfig") -> None:
|
32
32
|
"""
|
33
33
|
Set the configuration instance.
|
@@ -36,11 +36,11 @@ class BaseCfgAutoModule(ABC):
|
|
36
36
|
config: The DjangoConfig instance
|
37
37
|
"""
|
38
38
|
self._config = config
|
39
|
-
|
39
|
+
|
40
40
|
def get_config(self) -> Optional["DjangoConfig"]:
|
41
41
|
"""Get the current configuration instance."""
|
42
42
|
return self._config
|
43
|
-
|
43
|
+
|
44
44
|
def has_config_field(self, field_name: str) -> bool:
|
45
45
|
"""
|
46
46
|
Check if config has a specific field with a non-None value.
|
@@ -54,7 +54,7 @@ class BaseCfgAutoModule(ABC):
|
|
54
54
|
if not self._config:
|
55
55
|
return False
|
56
56
|
return hasattr(self._config, field_name) and getattr(self._config, field_name) is not None
|
57
|
-
|
57
|
+
|
58
58
|
def get_config_field(self, field_name: str, default=None):
|
59
59
|
"""
|
60
60
|
Get a field value from config with fallback.
|
@@ -69,7 +69,7 @@ class BaseCfgAutoModule(ABC):
|
|
69
69
|
if not self._config:
|
70
70
|
return default
|
71
71
|
return getattr(self._config, field_name, default)
|
72
|
-
|
72
|
+
|
73
73
|
@abstractmethod
|
74
74
|
def get_smart_defaults(self):
|
75
75
|
"""
|
@@ -79,7 +79,7 @@ class BaseCfgAutoModule(ABC):
|
|
79
79
|
Configuration object with intelligent defaults
|
80
80
|
"""
|
81
81
|
pass
|
82
|
-
|
82
|
+
|
83
83
|
@abstractmethod
|
84
84
|
def get_module_config(self):
|
85
85
|
"""
|
@@ -4,8 +4,8 @@ Django-specific configuration models for django_cfg.
|
|
4
4
|
Django integrations and extensions.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from .environment import EnvironmentConfig
|
8
7
|
from .constance import ConstanceConfig, ConstanceField
|
8
|
+
from .environment import EnvironmentConfig
|
9
9
|
from .openapi import OpenAPIClientConfig
|
10
10
|
|
11
11
|
__all__ = [
|
@@ -5,9 +5,10 @@ Type-safe configuration for django-constance with automatic
|
|
5
5
|
Unfold admin integration and smart field grouping.
|
6
6
|
"""
|
7
7
|
|
8
|
-
from typing import Dict, List,
|
8
|
+
from typing import Any, Dict, List, Literal, Optional, Union
|
9
|
+
|
9
10
|
from pydantic import BaseModel, Field, field_validator
|
10
|
-
|
11
|
+
|
11
12
|
from django_cfg.models.base import BaseCfgAutoModule
|
12
13
|
|
13
14
|
|
@@ -150,16 +151,16 @@ class ConstanceConfig(BaseModel, BaseCfgAutoModule):
|
|
150
151
|
default_factory=list,
|
151
152
|
description="List of Constance fields",
|
152
153
|
)
|
153
|
-
|
154
|
+
|
154
155
|
# Cache for app fields to avoid multiple calls
|
155
156
|
_app_fields_cache: Optional[List[ConstanceField]] = None
|
156
|
-
|
157
|
+
|
157
158
|
def _get_app_constance_fields(self) -> List[ConstanceField]:
|
158
159
|
"""Automatically collect constance fields from django-cfg apps."""
|
159
160
|
# Return cached result if available
|
160
161
|
if self._app_fields_cache is not None:
|
161
162
|
return self._app_fields_cache
|
162
|
-
|
163
|
+
|
163
164
|
app_fields = []
|
164
165
|
config = self.get_config()
|
165
166
|
|
@@ -171,7 +172,7 @@ class ConstanceConfig(BaseModel, BaseCfgAutoModule):
|
|
171
172
|
app_fields.extend(tasks_fields)
|
172
173
|
except (ImportError, Exception):
|
173
174
|
pass
|
174
|
-
|
175
|
+
|
175
176
|
# Get fields from knowbase app (only if enabled)
|
176
177
|
if config and config.enable_knowbase:
|
177
178
|
try:
|
@@ -180,7 +181,7 @@ class ConstanceConfig(BaseModel, BaseCfgAutoModule):
|
|
180
181
|
app_fields.extend(knowbase_fields)
|
181
182
|
except (ImportError, Exception):
|
182
183
|
pass
|
183
|
-
|
184
|
+
|
184
185
|
# Cache the result
|
185
186
|
self._app_fields_cache = app_fields
|
186
187
|
return app_fields
|
@@ -6,8 +6,10 @@ Core Django environment settings with Pydantic 2.
|
|
6
6
|
|
7
7
|
import os
|
8
8
|
from pathlib import Path
|
9
|
-
from typing import
|
10
|
-
|
9
|
+
from typing import Any, Dict, List
|
10
|
+
|
11
|
+
from pydantic import Field, computed_field, field_validator
|
12
|
+
|
11
13
|
from ..base import BaseConfig
|
12
14
|
|
13
15
|
|
@@ -71,7 +73,7 @@ class EnvironmentConfig(BaseConfig):
|
|
71
73
|
for insecure in insecure_keys:
|
72
74
|
if insecure in v.lower():
|
73
75
|
raise ValueError(
|
74
|
-
|
76
|
+
"Please change the secret key from default/example value"
|
75
77
|
)
|
76
78
|
|
77
79
|
return v
|
@@ -7,8 +7,10 @@ TypeScript and Python client generation from Django REST Framework endpoints.
|
|
7
7
|
This replaces django-revolution with a cleaner, faster, type-safe implementation.
|
8
8
|
"""
|
9
9
|
|
10
|
-
from typing import
|
10
|
+
from typing import Any, Dict, Optional
|
11
|
+
|
11
12
|
from pydantic import Field
|
13
|
+
|
12
14
|
from django_cfg.modules.django_client.core.config import OpenAPIConfig, OpenAPIGroupConfig
|
13
15
|
|
14
16
|
|
@@ -103,23 +105,11 @@ class OpenAPIClientConfig(OpenAPIConfig):
|
|
103
105
|
|
104
106
|
def get_groups_with_defaults(self) -> Dict[str, OpenAPIGroupConfig]:
|
105
107
|
"""
|
106
|
-
Get groups
|
107
|
-
|
108
|
-
Automatically adds the 'cfg' group with all django-cfg apps if not explicitly defined.
|
108
|
+
Get groups as a dictionary.
|
109
109
|
|
110
110
|
Returns:
|
111
|
-
Dict of groups
|
111
|
+
Dict of groups from configuration
|
112
112
|
"""
|
113
113
|
# Convert list to dict for compatibility
|
114
|
-
|
115
|
-
|
116
|
-
# Add default 'cfg' group if not explicitly defined
|
117
|
-
if 'cfg' not in groups_dict:
|
118
|
-
try:
|
119
|
-
from django_cfg.apps.urls import get_default_cfg_group
|
120
|
-
groups_dict['cfg'] = get_default_cfg_group()
|
121
|
-
except Exception:
|
122
|
-
pass
|
123
|
-
|
124
|
-
return groups_dict
|
114
|
+
return {group.name: group for group in self.groups}
|
125
115
|
|