django-cfg 1.3.13__py3-none-any.whl → 1.4.0__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 +1 -1
- django_cfg/apps/accounts/admin/user_admin.py +39 -16
- django_cfg/apps/accounts/serializers/profile.py +1 -1
- django_cfg/apps/accounts/services/otp_service.py +18 -11
- django_cfg/apps/accounts/signals.py +15 -24
- django_cfg/apps/accounts/utils/notifications.py +217 -358
- django_cfg/apps/accounts/views/otp.py +2 -2
- django_cfg/apps/accounts/views/webhook.py +1 -1
- django_cfg/apps/agents/core/django_agent.py +1 -1
- django_cfg/apps/api/commands/views.py +66 -83
- django_cfg/apps/api/health/drf_views.py +269 -0
- django_cfg/apps/api/health/serializers.py +45 -0
- django_cfg/apps/api/health/urls.py +6 -1
- django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
- django_cfg/apps/knowbase/admin/document_admin.py +136 -270
- django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
- django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
- django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
- django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
- django_cfg/apps/knowbase/config/constance_fields.py +1 -1
- django_cfg/apps/knowbase/config/settings.py +2 -2
- django_cfg/apps/knowbase/mixins/__init__.py +19 -2
- django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
- django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
- django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
- django_cfg/apps/knowbase/mixins/creator.py +10 -10
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
- django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
- django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
- django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
- django_cfg/apps/knowbase/mixins/service.py +2 -2
- django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
- django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
- django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
- django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
- django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
- django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
- django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
- django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
- django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
- django_cfg/apps/knowbase/services/embedding/models.py +18 -14
- django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
- django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
- django_cfg/apps/leads/tests.py +1 -1
- django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
- django_cfg/apps/payments/admin/balance_admin.py +1 -1
- django_cfg/apps/payments/admin/currencies_admin.py +1 -1
- django_cfg/apps/payments/admin/payments_admin.py +1 -1
- django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
- django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
- django_cfg/apps/payments/admin_interface/views/base.py +29 -2
- django_cfg/apps/payments/apps.py +1 -1
- django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
- django_cfg/apps/payments/config/helpers.py +3 -2
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
- django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
- django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
- django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
- django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
- django_cfg/apps/payments/management/commands/test_providers.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +1 -1
- django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
- django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
- django_cfg/apps/payments/models/balance.py +2 -2
- django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
- django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
- django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
- django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
- django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
- django_cfg/apps/payments/models/payments.py +2 -2
- django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
- django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
- django_cfg/apps/payments/services/core/base.py +1 -1
- django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
- django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
- django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
- django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
- django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
- django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
- django_cfg/apps/payments/services/core/payment_service.py +124 -612
- django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
- django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
- django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
- django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
- django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
- django_cfg/apps/payments/services/providers/base.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
- django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
- django_cfg/apps/payments/services/providers/registry.py +1 -1
- django_cfg/apps/payments/services/providers/sync_service.py +1 -1
- django_cfg/apps/payments/signals/__init__.py +1 -1
- django_cfg/apps/payments/signals/api_key_signals.py +1 -1
- django_cfg/apps/payments/signals/balance_signals.py +1 -1
- django_cfg/apps/payments/signals/payment_signals.py +1 -1
- django_cfg/apps/payments/signals/subscription_signals.py +1 -1
- django_cfg/apps/payments/views/api/api_keys.py +1 -1
- django_cfg/apps/payments/views/api/balances.py +1 -1
- django_cfg/apps/payments/views/api/base.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +1 -1
- django_cfg/apps/payments/views/api/payments.py +1 -1
- django_cfg/apps/payments/views/api/subscriptions.py +1 -1
- django_cfg/apps/payments/views/api/webhooks.py +1 -1
- django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
- django_cfg/apps/payments/views/serializers/balances.py +1 -1
- django_cfg/apps/payments/views/serializers/currencies.py +1 -1
- django_cfg/apps/payments/views/serializers/payments.py +1 -1
- django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
- django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
- django_cfg/apps/support/admin/support_admin.py +21 -13
- django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
- django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
- django_cfg/apps/support/utils/support_email_service.py +1 -1
- django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
- django_cfg/apps/tasks/utils/simulator.py +1 -1
- django_cfg/apps/tasks/views/dashboard.py +33 -3
- django_cfg/apps/urls.py +5 -1
- django_cfg/cli/README.md +57 -471
- django_cfg/cli/commands/create_project.py +140 -529
- django_cfg/cli/main.py +13 -10
- django_cfg/core/__init__.py +63 -6
- django_cfg/core/base/__init__.py +5 -0
- django_cfg/core/base/config_model.py +652 -0
- django_cfg/core/builders/__init__.py +11 -0
- django_cfg/core/builders/apps_builder.py +258 -0
- django_cfg/core/builders/middleware_builder.py +115 -0
- django_cfg/core/builders/security_builder.py +96 -0
- django_cfg/core/config.py +20 -892
- django_cfg/core/constants.py +69 -0
- django_cfg/core/environment/__init__.py +9 -0
- django_cfg/core/exceptions.py +45 -298
- django_cfg/core/generation/__init__.py +51 -0
- django_cfg/core/generation/core_generators/__init__.py +0 -0
- django_cfg/core/generation/core_generators/settings.py +90 -0
- django_cfg/core/generation/core_generators/static.py +82 -0
- django_cfg/core/generation/core_generators/templates.py +141 -0
- django_cfg/core/generation/data_generators/__init__.py +15 -0
- django_cfg/core/generation/data_generators/cache.py +132 -0
- django_cfg/core/generation/data_generators/database.py +117 -0
- django_cfg/core/generation/generation.py +92 -0
- django_cfg/core/generation/integration_generators/__init__.py +21 -0
- django_cfg/core/generation/integration_generators/api.py +237 -0
- django_cfg/core/generation/integration_generators/sessions.py +65 -0
- django_cfg/core/generation/integration_generators/tailwind.py +54 -0
- django_cfg/core/generation/integration_generators/tasks.py +92 -0
- django_cfg/core/generation/integration_generators/third_party.py +144 -0
- django_cfg/core/generation/orchestrator.py +285 -0
- django_cfg/core/generation/protocols.py +30 -0
- django_cfg/core/generation/security_generators/__init__.py +0 -0
- django_cfg/core/generation/utility_generators/__init__.py +24 -0
- django_cfg/core/generation/utility_generators/email.py +58 -0
- django_cfg/core/generation/utility_generators/i18n.py +66 -0
- django_cfg/core/generation/utility_generators/limits.py +58 -0
- django_cfg/core/generation/utility_generators/logging.py +66 -0
- django_cfg/core/generation/utility_generators/security.py +101 -0
- django_cfg/core/generation/utils/__init__.py +0 -0
- django_cfg/core/generation/utils/helpers.py +32 -0
- django_cfg/core/integration/__init__.py +18 -25
- django_cfg/core/integration/display/startup.py +146 -133
- django_cfg/core/integration/url_integration.py +13 -2
- django_cfg/core/services/__init__.py +5 -0
- django_cfg/core/services/config_service.py +121 -0
- django_cfg/core/state/__init__.py +9 -0
- django_cfg/core/state/registry.py +84 -0
- django_cfg/core/types/__init__.py +15 -0
- django_cfg/core/types/aliases.py +15 -0
- django_cfg/core/types/enums.py +49 -0
- django_cfg/dashboard/DEBUG_README.md +105 -0
- django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
- django_cfg/dashboard/__init__.py +24 -0
- django_cfg/dashboard/components.py +308 -0
- django_cfg/dashboard/debug.py +176 -0
- django_cfg/dashboard/management/__init__.py +0 -0
- django_cfg/dashboard/management/commands/__init__.py +0 -0
- django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
- django_cfg/dashboard/sections/__init__.py +1 -0
- django_cfg/dashboard/sections/base.py +128 -0
- django_cfg/dashboard/sections/commands.py +32 -0
- django_cfg/dashboard/sections/overview.py +394 -0
- django_cfg/dashboard/sections/stats.py +48 -0
- django_cfg/dashboard/sections/system.py +73 -0
- django_cfg/management/commands/check_settings.py +6 -2
- django_cfg/management/commands/clear_constance.py +6 -1
- django_cfg/management/commands/create_token.py +5 -4
- django_cfg/management/commands/generate.py +5 -0
- django_cfg/management/commands/list_urls.py +7 -2
- django_cfg/management/commands/migrate_all.py +6 -2
- django_cfg/management/commands/migrator.py +6 -1
- django_cfg/management/commands/rundramatiq.py +6 -1
- django_cfg/management/commands/rundramatiq_simulator.py +11 -4
- django_cfg/management/commands/runserver_ngrok.py +9 -7
- django_cfg/management/commands/script.py +25 -21
- django_cfg/management/commands/show_config.py +6 -1
- django_cfg/management/commands/show_urls.py +8 -3
- django_cfg/management/commands/superuser.py +5 -4
- django_cfg/management/commands/task_clear.py +8 -3
- django_cfg/management/commands/task_status.py +8 -3
- django_cfg/management/commands/test_email.py +6 -1
- django_cfg/management/commands/test_telegram.py +6 -1
- django_cfg/management/commands/test_twilio.py +6 -1
- django_cfg/management/commands/tree.py +7 -4
- django_cfg/models/__init__.py +88 -3
- django_cfg/models/api/__init__.py +27 -0
- django_cfg/models/{api.py → api/config.py} +1 -1
- django_cfg/models/api/drf/__init__.py +21 -0
- django_cfg/models/api/drf/config.py +101 -0
- django_cfg/models/api/drf/redoc.py +31 -0
- django_cfg/models/api/drf/spectacular.py +129 -0
- django_cfg/models/api/drf/swagger.py +59 -0
- django_cfg/models/{api_keys.py → api/keys.py} +16 -6
- django_cfg/models/{limits.py → api/limits.py} +0 -1
- django_cfg/models/base/__init__.py +14 -0
- django_cfg/models/django/__init__.py +16 -0
- django_cfg/models/{constance.py → django/constance.py} +1 -1
- django_cfg/models/{environment.py → django/environment.py} +1 -1
- django_cfg/models/infrastructure/__init__.py +17 -0
- django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
- django_cfg/models/infrastructure/database/__init__.py +22 -0
- django_cfg/models/infrastructure/database/config.py +265 -0
- django_cfg/models/infrastructure/database/converters.py +91 -0
- django_cfg/models/infrastructure/database/parsers.py +96 -0
- django_cfg/models/infrastructure/database/routing.py +85 -0
- django_cfg/models/infrastructure/database/validators.py +170 -0
- django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
- django_cfg/models/{security.py → infrastructure/security.py} +2 -2
- django_cfg/models/ngrok/__init__.py +11 -0
- django_cfg/models/ngrok/auth.py +37 -0
- django_cfg/models/ngrok/config.py +77 -0
- django_cfg/models/ngrok/tunnel.py +35 -0
- django_cfg/models/payments/__init__.py +20 -0
- django_cfg/models/payments/api_keys.py +57 -0
- django_cfg/models/{payments.py → payments/config.py} +56 -154
- django_cfg/models/payments/providers/__init__.py +15 -0
- django_cfg/models/payments/providers/base.py +25 -0
- django_cfg/models/payments/providers/nowpayments.py +48 -0
- django_cfg/models/services/__init__.py +18 -0
- django_cfg/models/services/base.py +65 -0
- django_cfg/models/{email.py → services/email.py} +1 -1
- django_cfg/models/services/telegram.py +172 -0
- django_cfg/models/tasks/__init__.py +51 -0
- django_cfg/models/tasks/backends.py +250 -0
- django_cfg/models/tasks/config.py +314 -0
- django_cfg/models/tasks/utils.py +174 -0
- django_cfg/modules/base.py +18 -3
- django_cfg/modules/django_admin/decorators/actions.py +1 -1
- django_cfg/modules/django_admin/decorators/display.py +1 -1
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
- django_cfg/modules/django_cfg_rpc_client/README.md +346 -0
- django_cfg/modules/django_cfg_rpc_client/__init__.py +51 -0
- django_cfg/modules/django_cfg_rpc_client/client.py +540 -0
- django_cfg/modules/django_cfg_rpc_client/config.py +207 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/README.md +517 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/__init__.py +11 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/apps.py +22 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/monitor.py +435 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/static/django_cfg_rpc_dashboard/js/dashboard.js +373 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/base.html +76 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/dashboard.html +200 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/urls.py +22 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/urls_admin.py +9 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/views.py +251 -0
- django_cfg/modules/django_cfg_rpc_client/exceptions.py +201 -0
- django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
- django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
- django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
- django_cfg/modules/django_drf_theme/README.md +207 -0
- django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
- django_cfg/modules/django_drf_theme/__init__.py +23 -0
- django_cfg/modules/django_drf_theme/apps.py +15 -0
- django_cfg/modules/django_drf_theme/renderers.py +58 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
- django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
- django_cfg/modules/django_email/__init__.py +14 -0
- django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
- django_cfg/modules/django_email/utils.py +40 -0
- django_cfg/modules/django_health/__init__.py +9 -0
- django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
- django_cfg/modules/django_llm/llm/client.py +155 -550
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
- django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
- django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
- django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
- django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
- django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
- django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
- django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
- django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
- django_cfg/modules/django_llm/translator/translator.py +150 -603
- django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
- django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
- django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
- django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
- django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
- django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
- django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
- django_cfg/modules/django_logging/__init__.py +14 -0
- django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
- django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
- django_cfg/modules/django_ngrok/__init__.py +39 -0
- django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
- django_cfg/modules/django_rpc_old/POETRY.md +344 -0
- django_cfg/modules/django_rpc_old/README.md +397 -0
- django_cfg/modules/django_rpc_old/TESTING.md +358 -0
- django_cfg/modules/django_rpc_old/__init__.py +39 -0
- django_cfg/modules/django_rpc_old/client.py +531 -0
- django_cfg/modules/django_rpc_old/config.py +279 -0
- django_cfg/modules/django_rpc_old/exceptions.py +172 -0
- django_cfg/modules/django_tailwind/README.md +478 -0
- django_cfg/modules/django_tailwind/__init__.py +7 -0
- django_cfg/modules/django_tailwind/apps.py +10 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
- django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
- django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
- django_cfg/modules/django_tasks/__init__.py +29 -0
- django_cfg/modules/django_tasks/factory.py +127 -0
- django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
- django_cfg/modules/django_tasks/settings.py +107 -0
- django_cfg/modules/django_telegram/__init__.py +29 -0
- django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
- django_cfg/modules/django_telegram/utils.py +62 -0
- django_cfg/modules/django_twilio/__init__.py +54 -107
- django_cfg/modules/django_twilio/_imports.py +30 -0
- django_cfg/modules/django_twilio/base.py +192 -0
- django_cfg/modules/django_twilio/email_otp.py +227 -0
- django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
- django_cfg/modules/django_twilio/simple_service.py +1 -2
- django_cfg/modules/django_twilio/sms.py +94 -0
- django_cfg/modules/django_twilio/twilio_service.py +2 -3
- django_cfg/modules/django_twilio/unified.py +310 -0
- django_cfg/modules/django_twilio/utils.py +190 -0
- django_cfg/modules/django_twilio/whatsapp.py +137 -0
- django_cfg/modules/django_unfold/callbacks/base.py +198 -7
- django_cfg/modules/django_unfold/callbacks/main.py +102 -10
- django_cfg/modules/django_unfold/dashboard.py +65 -43
- django_cfg/modules/django_unfold/models/config.py +13 -12
- django_cfg/modules/django_unfold/models/navigation.py +8 -3
- django_cfg/modules/django_unfold/models/tabs.py +2 -2
- django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
- django_cfg/registry/core.py +24 -26
- django_cfg/registry/modules.py +5 -2
- django_cfg/registry/services.py +20 -3
- django_cfg/registry/third_party.py +8 -8
- django_cfg/static/admin/css/dashboard.css +260 -0
- django_cfg/static/admin/js/commands.js +171 -0
- django_cfg/static/admin/js/dashboard.js +126 -0
- django_cfg/templates/admin/components/management_commands.js +375 -0
- django_cfg/templates/admin/components/progress_bar.html +18 -23
- django_cfg/templates/admin/index.html +48 -20
- django_cfg/templates/admin/index_new.html +106 -0
- django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
- django_cfg/templates/admin/sections/commands_section.html +626 -0
- django_cfg/templates/admin/sections/overview_section.html +112 -0
- django_cfg/templates/admin/sections/stats_section.html +35 -0
- django_cfg/templates/admin/sections/system_section.html +99 -0
- django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
- django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
- django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
- django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
- django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
- django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
- django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
- django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
- django_cfg/templatetags/django_cfg.py +7 -1
- django_cfg/utils/smart_defaults.py +4 -4
- django_cfg-1.4.0.dist-info/METADATA +920 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/RECORD +424 -195
- django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
- django_cfg/core/generation.py +0 -621
- django_cfg/management/commands/validate_config.py +0 -189
- django_cfg/models/database.py +0 -480
- django_cfg/models/drf.py +0 -272
- django_cfg/models/ngrok.py +0 -122
- django_cfg/models/services.py +0 -440
- django_cfg/models/tasks.py +0 -550
- django_cfg/modules/django_twilio/service.py +0 -942
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/templates/rest_framework/api.html +0 -12
- django_cfg/utils/toolkit.py +0 -703
- django_cfg-1.3.13.dist-info/METADATA +0 -1029
- /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
- /django_cfg/core/{environment.py → environment/detector.py} +0 -0
- /django_cfg/models/{cors.py → api/cors.py} +0 -0
- /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
- /django_cfg/models/{base.py → base/config.py} +0 -0
- /django_cfg/models/{cfg.py → base/module.py} +0 -0
- /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
- /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -7,7 +7,7 @@ Django logging settings with Pydantic 2.
|
|
7
7
|
from typing import Dict, Any, List, Optional
|
8
8
|
from pathlib import Path
|
9
9
|
from pydantic import Field, field_validator
|
10
|
-
from
|
10
|
+
from ..base import BaseConfig
|
11
11
|
|
12
12
|
|
13
13
|
class LoggerConfig(BaseConfig):
|
@@ -6,7 +6,7 @@ Django security settings with Pydantic 2.
|
|
6
6
|
|
7
7
|
from typing import List, Dict, Any
|
8
8
|
from pydantic import Field, field_validator
|
9
|
-
from
|
9
|
+
from ..base import BaseConfig
|
10
10
|
|
11
11
|
|
12
12
|
class SecurityConfig(BaseConfig):
|
@@ -103,7 +103,7 @@ class SecurityConfig(BaseConfig):
|
|
103
103
|
})
|
104
104
|
|
105
105
|
# Add corsheaders to middleware if not present
|
106
|
-
# This will be handled by the main
|
106
|
+
# This will be handled by the main DjangoConfig
|
107
107
|
|
108
108
|
# CSRF settings
|
109
109
|
settings.update({
|
@@ -0,0 +1,37 @@
|
|
1
|
+
"""
|
2
|
+
Ngrok authentication configuration.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import Optional
|
6
|
+
from pydantic import BaseModel, Field
|
7
|
+
import os
|
8
|
+
|
9
|
+
|
10
|
+
class NgrokAuthConfig(BaseModel):
|
11
|
+
"""Ngrok authentication configuration."""
|
12
|
+
|
13
|
+
authtoken: Optional[str] = Field(
|
14
|
+
default=None,
|
15
|
+
description="Ngrok auth token (loaded from NGROK_AUTHTOKEN env var if not provided)",
|
16
|
+
repr=False # Don't show in repr for security
|
17
|
+
)
|
18
|
+
|
19
|
+
authtoken_from_env: bool = Field(
|
20
|
+
default=True, # Try to load from env var by default
|
21
|
+
description="Load auth token from NGROK_AUTHTOKEN environment variable"
|
22
|
+
)
|
23
|
+
|
24
|
+
def get_authtoken(self) -> Optional[str]:
|
25
|
+
"""Get auth token from config or environment."""
|
26
|
+
if self.authtoken:
|
27
|
+
return self.authtoken
|
28
|
+
|
29
|
+
if self.authtoken_from_env:
|
30
|
+
return os.environ.get("NGROK_AUTHTOKEN")
|
31
|
+
|
32
|
+
return None
|
33
|
+
|
34
|
+
|
35
|
+
__all__ = [
|
36
|
+
"NgrokAuthConfig",
|
37
|
+
]
|
@@ -0,0 +1,77 @@
|
|
1
|
+
"""
|
2
|
+
Main ngrok configuration for django_cfg.
|
3
|
+
|
4
|
+
Simplified flat structure - only essential fields.
|
5
|
+
Domain and schemes are auto-determined from api_url in config.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from typing import Optional, List
|
9
|
+
from pydantic import BaseModel, Field, field_validator
|
10
|
+
import os
|
11
|
+
|
12
|
+
|
13
|
+
class NgrokConfig(BaseModel):
|
14
|
+
"""Simplified flat ngrok configuration for django-cfg.
|
15
|
+
|
16
|
+
Key simplifications:
|
17
|
+
- No domain field (uses api_url from DjangoConfig automatically)
|
18
|
+
- No schemes field (auto-determined from api_url: http:// -> http, https:// -> https)
|
19
|
+
- Flat structure (no nested NgrokAuthConfig/NgrokTunnelConfig)
|
20
|
+
"""
|
21
|
+
|
22
|
+
model_config = {
|
23
|
+
"str_strip_whitespace": True,
|
24
|
+
"validate_assignment": True,
|
25
|
+
"extra": "forbid"
|
26
|
+
}
|
27
|
+
|
28
|
+
# Control
|
29
|
+
enabled: bool = Field(
|
30
|
+
default=False,
|
31
|
+
description="Enable ngrok integration (only works in DEBUG mode)"
|
32
|
+
)
|
33
|
+
|
34
|
+
# Authentication
|
35
|
+
authtoken: Optional[str] = Field(
|
36
|
+
default=None,
|
37
|
+
description="Ngrok auth token. If None, will try NGROK_AUTHTOKEN env var",
|
38
|
+
repr=False # Don't show in repr for security
|
39
|
+
)
|
40
|
+
|
41
|
+
# Optional tunnel features
|
42
|
+
basic_auth: Optional[List[str]] = Field(
|
43
|
+
default=None,
|
44
|
+
description="Basic auth credentials in format ['user:pass']"
|
45
|
+
)
|
46
|
+
|
47
|
+
compression: bool = Field(
|
48
|
+
default=True,
|
49
|
+
description="Enable gzip compression"
|
50
|
+
)
|
51
|
+
|
52
|
+
@field_validator("enabled")
|
53
|
+
@classmethod
|
54
|
+
def validate_enabled_in_debug_only(cls, v: bool) -> bool:
|
55
|
+
"""Ensure ngrok is only enabled in debug mode."""
|
56
|
+
if v:
|
57
|
+
# Only check if Django is available and fully configured
|
58
|
+
try:
|
59
|
+
from django.conf import settings
|
60
|
+
# Only validate if settings are configured and DEBUG attribute exists
|
61
|
+
if settings.configured and hasattr(settings, 'DEBUG') and not settings.DEBUG:
|
62
|
+
raise ValueError("Ngrok can only be enabled in DEBUG mode")
|
63
|
+
except (ImportError, AttributeError, RuntimeError):
|
64
|
+
# Django not available, not configured, or settings not ready - skip validation
|
65
|
+
pass
|
66
|
+
return v
|
67
|
+
|
68
|
+
def get_authtoken(self) -> Optional[str]:
|
69
|
+
"""Get auth token from config or environment."""
|
70
|
+
if self.authtoken:
|
71
|
+
return self.authtoken
|
72
|
+
return os.environ.get("NGROK_AUTHTOKEN")
|
73
|
+
|
74
|
+
|
75
|
+
__all__ = [
|
76
|
+
"NgrokConfig",
|
77
|
+
]
|
@@ -0,0 +1,35 @@
|
|
1
|
+
"""
|
2
|
+
Ngrok tunnel configuration.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import Optional, List, Literal
|
6
|
+
from pydantic import BaseModel, Field
|
7
|
+
|
8
|
+
|
9
|
+
class NgrokTunnelConfig(BaseModel):
|
10
|
+
"""Configuration for ngrok tunnel."""
|
11
|
+
|
12
|
+
domain: Optional[str] = Field(
|
13
|
+
default=None,
|
14
|
+
description="Custom domain for tunnel (requires paid ngrok plan)"
|
15
|
+
)
|
16
|
+
|
17
|
+
schemes: List[Literal["http", "https"]] = Field(
|
18
|
+
default_factory=lambda: ["http", "https"],
|
19
|
+
description="URL schemes to tunnel"
|
20
|
+
)
|
21
|
+
|
22
|
+
basic_auth: Optional[List[str]] = Field(
|
23
|
+
default=None,
|
24
|
+
description="Basic auth credentials in format ['user:pass']"
|
25
|
+
)
|
26
|
+
|
27
|
+
compression: bool = Field(
|
28
|
+
default=True,
|
29
|
+
description="Enable gzip compression"
|
30
|
+
)
|
31
|
+
|
32
|
+
|
33
|
+
__all__ = [
|
34
|
+
"NgrokTunnelConfig",
|
35
|
+
]
|
@@ -0,0 +1,20 @@
|
|
1
|
+
"""
|
2
|
+
Payment configuration models for django_cfg.
|
3
|
+
|
4
|
+
Provides type-safe configuration for payment providers and API keys:
|
5
|
+
- PaymentsConfig: Main payments configuration
|
6
|
+
- ProviderAPIKeysConfig: API keys management
|
7
|
+
- BaseProviderConfig: Base provider configuration
|
8
|
+
- NowPaymentsProviderConfig: NowPayments provider
|
9
|
+
"""
|
10
|
+
|
11
|
+
from .config import PaymentsConfig
|
12
|
+
from .api_keys import ProviderAPIKeysConfig
|
13
|
+
from .providers import BaseProviderConfig, NowPaymentsProviderConfig
|
14
|
+
|
15
|
+
__all__ = [
|
16
|
+
"PaymentsConfig",
|
17
|
+
"ProviderAPIKeysConfig",
|
18
|
+
"BaseProviderConfig",
|
19
|
+
"NowPaymentsProviderConfig",
|
20
|
+
]
|
@@ -0,0 +1,57 @@
|
|
1
|
+
"""
|
2
|
+
API keys configuration for payment providers.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from pydantic import BaseModel, Field
|
6
|
+
from typing import List, Dict, Optional
|
7
|
+
from .providers.base import BaseProviderConfig
|
8
|
+
|
9
|
+
|
10
|
+
class ProviderAPIKeysConfig(BaseModel):
|
11
|
+
"""
|
12
|
+
API keys configuration for payment providers.
|
13
|
+
|
14
|
+
Stores list of provider configurations.
|
15
|
+
"""
|
16
|
+
|
17
|
+
providers: List[BaseProviderConfig] = Field(
|
18
|
+
default_factory=list,
|
19
|
+
description="List of provider configurations"
|
20
|
+
)
|
21
|
+
|
22
|
+
def add_provider(self, provider_config: BaseProviderConfig):
|
23
|
+
"""Add a provider configuration."""
|
24
|
+
# Remove existing provider with same name
|
25
|
+
self.providers = [p for p in self.providers if p.provider_name != provider_config.provider_name]
|
26
|
+
self.providers.append(provider_config)
|
27
|
+
|
28
|
+
def get_provider_config(self, provider: str) -> Dict[str, any]:
|
29
|
+
"""Get provider-specific configuration."""
|
30
|
+
provider_lower = provider.lower()
|
31
|
+
|
32
|
+
for provider_config in self.providers:
|
33
|
+
if provider_config.provider_name.lower() == provider_lower:
|
34
|
+
return provider_config.get_provider_config()
|
35
|
+
|
36
|
+
return {'enabled': False, 'provider_name': provider}
|
37
|
+
|
38
|
+
def get_enabled_providers(self) -> List[str]:
|
39
|
+
"""Get list of enabled providers."""
|
40
|
+
enabled = []
|
41
|
+
for provider_config in self.providers:
|
42
|
+
config = provider_config.get_provider_config()
|
43
|
+
if config.get('enabled', False):
|
44
|
+
enabled.append(provider_config.provider_name)
|
45
|
+
return enabled
|
46
|
+
|
47
|
+
def get_provider_by_name(self, provider_name: str) -> Optional[BaseProviderConfig]:
|
48
|
+
"""Get provider configuration by name."""
|
49
|
+
for provider_config in self.providers:
|
50
|
+
if provider_config.provider_name.lower() == provider_name.lower():
|
51
|
+
return provider_config
|
52
|
+
return None
|
53
|
+
|
54
|
+
|
55
|
+
__all__ = [
|
56
|
+
"ProviderAPIKeysConfig",
|
57
|
+
]
|
@@ -1,135 +1,41 @@
|
|
1
1
|
"""
|
2
|
-
|
2
|
+
Main payments configuration for django_cfg.
|
3
3
|
|
4
|
-
|
4
|
+
Payments app configuration with middleware, rate limiting, and usage tracking.
|
5
5
|
"""
|
6
6
|
|
7
7
|
from pydantic import BaseModel, Field
|
8
|
-
from typing import List, Dict
|
9
|
-
from django_cfg.models.
|
10
|
-
|
11
|
-
|
12
|
-
class BaseProviderConfig(BaseModel):
|
13
|
-
"""Base configuration for payment providers."""
|
14
|
-
|
15
|
-
provider_name: str = Field(..., description="Provider name")
|
16
|
-
enabled: bool = Field(default=True, description="Whether provider is enabled")
|
17
|
-
|
18
|
-
def get_provider_config(self) -> Dict[str, any]:
|
19
|
-
"""Get provider-specific configuration."""
|
20
|
-
return {
|
21
|
-
'provider_name': self.provider_name,
|
22
|
-
'enabled': self.enabled,
|
23
|
-
}
|
24
|
-
|
25
|
-
|
26
|
-
class NowPaymentsProviderConfig(BaseProviderConfig):
|
27
|
-
"""NowPayments provider configuration."""
|
28
|
-
|
29
|
-
provider_name: str = Field(default="nowpayments", description="Provider name")
|
30
|
-
api_key: str = Field(default="", description="NowPayments API key")
|
31
|
-
ipn_secret: str = Field(default="", description="NowPayments IPN secret for webhook validation")
|
32
|
-
sandbox_mode: bool = Field(default=True, description="NowPayments sandbox mode")
|
33
|
-
|
34
|
-
def get_provider_config(self) -> Dict[str, any]:
|
35
|
-
"""Get NowPayments-specific configuration."""
|
36
|
-
return {
|
37
|
-
'provider_name': self.provider_name,
|
38
|
-
'enabled': self.enabled and bool(self.api_key.strip()),
|
39
|
-
'api_key': self.api_key,
|
40
|
-
'ipn_secret': self.ipn_secret,
|
41
|
-
'sandbox_mode': self.sandbox_mode,
|
42
|
-
}
|
43
|
-
|
44
|
-
|
45
|
-
# Future provider configs (commented out for now)
|
46
|
-
# class StripeProviderConfig(BaseProviderConfig):
|
47
|
-
# """Stripe provider configuration."""
|
48
|
-
#
|
49
|
-
# provider_name: str = Field(default="stripe", description="Provider name")
|
50
|
-
# api_key: str = Field(default="", description="Stripe API key")
|
51
|
-
# webhook_secret: str = Field(default="", description="Stripe webhook secret")
|
52
|
-
#
|
53
|
-
# def get_provider_config(self) -> Dict[str, any]:
|
54
|
-
# return {
|
55
|
-
# 'provider_name': self.provider_name,
|
56
|
-
# 'enabled': self.enabled and bool(self.api_key.strip()),
|
57
|
-
# 'api_key': self.api_key,
|
58
|
-
# 'webhook_secret': self.webhook_secret,
|
59
|
-
# }
|
60
|
-
|
61
|
-
|
62
|
-
class ProviderAPIKeysConfig(BaseModel):
|
63
|
-
"""
|
64
|
-
API keys configuration for payment providers.
|
65
|
-
|
66
|
-
Stores list of provider configurations.
|
67
|
-
"""
|
68
|
-
|
69
|
-
providers: List[BaseProviderConfig] = Field(
|
70
|
-
default_factory=list,
|
71
|
-
description="List of provider configurations"
|
72
|
-
)
|
73
|
-
|
74
|
-
def add_provider(self, provider_config: BaseProviderConfig):
|
75
|
-
"""Add a provider configuration."""
|
76
|
-
# Remove existing provider with same name
|
77
|
-
self.providers = [p for p in self.providers if p.provider_name != provider_config.provider_name]
|
78
|
-
self.providers.append(provider_config)
|
79
|
-
|
80
|
-
def get_provider_config(self, provider: str) -> Dict[str, any]:
|
81
|
-
"""Get provider-specific configuration."""
|
82
|
-
provider_lower = provider.lower()
|
83
|
-
|
84
|
-
for provider_config in self.providers:
|
85
|
-
if provider_config.provider_name.lower() == provider_lower:
|
86
|
-
return provider_config.get_provider_config()
|
87
|
-
|
88
|
-
return {'enabled': False, 'provider_name': provider}
|
89
|
-
|
90
|
-
def get_enabled_providers(self) -> List[str]:
|
91
|
-
"""Get list of enabled providers."""
|
92
|
-
enabled = []
|
93
|
-
for provider_config in self.providers:
|
94
|
-
config = provider_config.get_provider_config()
|
95
|
-
if config.get('enabled', False):
|
96
|
-
enabled.append(provider_config.provider_name)
|
97
|
-
return enabled
|
98
|
-
|
99
|
-
def get_provider_by_name(self, provider_name: str) -> Optional[BaseProviderConfig]:
|
100
|
-
"""Get provider configuration by name."""
|
101
|
-
for provider_config in self.providers:
|
102
|
-
if provider_config.provider_name.lower() == provider_name.lower():
|
103
|
-
return provider_config
|
104
|
-
return None
|
8
|
+
from typing import List, Dict
|
9
|
+
from django_cfg.models.base import BaseCfgAutoModule
|
10
|
+
from .api_keys import ProviderAPIKeysConfig
|
105
11
|
|
106
12
|
|
107
13
|
class PaymentsConfig(BaseModel, BaseCfgAutoModule):
|
108
14
|
"""
|
109
15
|
Payments app configuration for django-cfg.
|
110
|
-
|
16
|
+
|
111
17
|
Includes both static configuration and API keys.
|
112
18
|
API keys are now managed through BaseCfgAutoModule instead of Constance.
|
113
19
|
"""
|
114
|
-
|
20
|
+
|
115
21
|
# Core settings
|
116
22
|
enabled: bool = Field(
|
117
|
-
default=False,
|
23
|
+
default=False,
|
118
24
|
description="Enable payments app"
|
119
25
|
)
|
120
|
-
|
26
|
+
|
121
27
|
# API keys configuration
|
122
28
|
api_keys: ProviderAPIKeysConfig = Field(
|
123
29
|
default_factory=ProviderAPIKeysConfig,
|
124
30
|
description="API keys and secrets for payment providers"
|
125
31
|
)
|
126
|
-
|
32
|
+
|
127
33
|
# Middleware settings
|
128
34
|
middleware_enabled: bool = Field(
|
129
35
|
default=True,
|
130
36
|
description="Enable payments middleware"
|
131
37
|
)
|
132
|
-
|
38
|
+
|
133
39
|
# Whitelist approach - only these paths require API key
|
134
40
|
protected_paths: List[str] = Field(
|
135
41
|
default=[
|
@@ -139,22 +45,22 @@ class PaymentsConfig(BaseModel, BaseCfgAutoModule):
|
|
139
45
|
],
|
140
46
|
description="Paths that require API key authentication (whitelist approach)"
|
141
47
|
)
|
142
|
-
|
48
|
+
|
143
49
|
protected_patterns: List[str] = Field(
|
144
50
|
default=[
|
145
51
|
r'^/api/admin/.*$', # All admin API endpoints
|
146
|
-
r'^/api/private/.*$', # All private API endpoints
|
52
|
+
r'^/api/private/.*$', # All private API endpoints
|
147
53
|
r'^/api/secure/.*$', # All secure API endpoints
|
148
54
|
],
|
149
55
|
description="Regex patterns for paths that require API key authentication"
|
150
56
|
)
|
151
|
-
|
57
|
+
|
152
58
|
# Rate limiting defaults
|
153
59
|
rate_limiting_enabled: bool = Field(
|
154
60
|
default=True,
|
155
61
|
description="Enable rate limiting middleware"
|
156
62
|
)
|
157
|
-
|
63
|
+
|
158
64
|
default_rate_limits: Dict[str, int] = Field(
|
159
65
|
default={
|
160
66
|
'anonymous': 60,
|
@@ -166,18 +72,18 @@ class PaymentsConfig(BaseModel, BaseCfgAutoModule):
|
|
166
72
|
},
|
167
73
|
description="Default rate limits (requests per minute) by tier"
|
168
74
|
)
|
169
|
-
|
75
|
+
|
170
76
|
# Usage tracking
|
171
77
|
usage_tracking_enabled: bool = Field(
|
172
78
|
default=True,
|
173
79
|
description="Enable usage tracking middleware"
|
174
80
|
)
|
175
|
-
|
81
|
+
|
176
82
|
track_anonymous_usage: bool = Field(
|
177
83
|
default=False,
|
178
84
|
description="Track anonymous user requests"
|
179
85
|
)
|
180
|
-
|
86
|
+
|
181
87
|
# Cache settings
|
182
88
|
cache_timeouts: Dict[str, int] = Field(
|
183
89
|
default={
|
@@ -188,94 +94,94 @@ class PaymentsConfig(BaseModel, BaseCfgAutoModule):
|
|
188
94
|
},
|
189
95
|
description="Cache timeout settings in seconds"
|
190
96
|
)
|
191
|
-
|
97
|
+
|
192
98
|
def get_middleware_classes(self) -> List[str]:
|
193
99
|
"""
|
194
100
|
Get middleware classes to add to Django MIDDLEWARE setting.
|
195
|
-
|
101
|
+
|
196
102
|
Returns:
|
197
103
|
List of middleware class paths
|
198
104
|
"""
|
199
105
|
if not self.enabled or not self.middleware_enabled:
|
200
106
|
return []
|
201
|
-
|
107
|
+
|
202
108
|
middleware = []
|
203
|
-
|
109
|
+
|
204
110
|
# Always add API access middleware first
|
205
111
|
middleware.append('django_cfg.apps.payments.middleware.APIAccessMiddleware')
|
206
|
-
|
112
|
+
|
207
113
|
# Add rate limiting if enabled
|
208
114
|
if self.rate_limiting_enabled:
|
209
115
|
middleware.append('django_cfg.apps.payments.middleware.RateLimitingMiddleware')
|
210
|
-
|
116
|
+
|
211
117
|
# Add usage tracking if enabled
|
212
118
|
if self.usage_tracking_enabled:
|
213
119
|
middleware.append('django_cfg.apps.payments.middleware.UsageTrackingMiddleware')
|
214
|
-
|
120
|
+
|
215
121
|
return middleware
|
216
|
-
|
122
|
+
|
217
123
|
def should_enable_tasks(self) -> bool:
|
218
124
|
"""
|
219
125
|
Check if payments app requires Celery tasks.
|
220
|
-
|
126
|
+
|
221
127
|
Returns:
|
222
128
|
True if tasks should be enabled
|
223
129
|
"""
|
224
130
|
return self.enabled # Enable tasks if payments is enabled
|
225
|
-
|
131
|
+
|
226
132
|
# Navigation and UI feature checks
|
227
133
|
def show_webhook_dashboard(self) -> bool:
|
228
134
|
"""Check if webhook dashboard should be shown in navigation."""
|
229
135
|
return self.enabled
|
230
|
-
|
136
|
+
|
231
137
|
def show_payment_creation(self) -> bool:
|
232
138
|
"""Check if payment creation should be shown in navigation."""
|
233
139
|
return self.enabled
|
234
|
-
|
140
|
+
|
235
141
|
def show_currency_converter(self) -> bool:
|
236
142
|
"""Check if currency converter should be shown in navigation."""
|
237
143
|
return self.enabled
|
238
|
-
|
144
|
+
|
239
145
|
def show_api_management(self) -> bool:
|
240
146
|
"""Check if API key management should be shown in navigation."""
|
241
147
|
return self.enabled
|
242
|
-
|
148
|
+
|
243
149
|
def show_subscription_management(self) -> bool:
|
244
150
|
"""Check if subscription management should be shown in navigation."""
|
245
151
|
return self.enabled
|
246
|
-
|
152
|
+
|
247
153
|
def show_balance_management(self) -> bool:
|
248
154
|
"""Check if balance management should be shown in navigation."""
|
249
155
|
return self.enabled
|
250
|
-
|
156
|
+
|
251
157
|
def show_transaction_history(self) -> bool:
|
252
158
|
"""Check if transaction history should be shown in navigation."""
|
253
159
|
return self.enabled
|
254
|
-
|
160
|
+
|
255
161
|
def show_currency_management(self) -> bool:
|
256
162
|
"""Check if currency management should be shown in navigation."""
|
257
163
|
return self.enabled
|
258
|
-
|
164
|
+
|
259
165
|
def show_rate_limiting_features(self) -> bool:
|
260
166
|
"""Check if rate limiting features should be shown."""
|
261
167
|
return self.enabled and self.rate_limiting_enabled
|
262
|
-
|
168
|
+
|
263
169
|
def show_usage_tracking_features(self) -> bool:
|
264
170
|
"""Check if usage tracking features should be shown."""
|
265
171
|
return self.enabled and self.usage_tracking_enabled
|
266
|
-
|
172
|
+
|
267
173
|
def get_enabled_navigation_items(self) -> List[str]:
|
268
174
|
"""
|
269
175
|
Get list of enabled navigation items for dynamic UI generation.
|
270
|
-
|
176
|
+
|
271
177
|
Returns:
|
272
178
|
List of enabled navigation item identifiers
|
273
179
|
"""
|
274
180
|
items = []
|
275
|
-
|
181
|
+
|
276
182
|
if not self.enabled:
|
277
183
|
return items
|
278
|
-
|
184
|
+
|
279
185
|
# Core features (always enabled if payments is enabled)
|
280
186
|
items.extend([
|
281
187
|
'payment_dashboard',
|
@@ -284,59 +190,59 @@ class PaymentsConfig(BaseModel, BaseCfgAutoModule):
|
|
284
190
|
'networks_admin',
|
285
191
|
'provider_currencies_admin',
|
286
192
|
])
|
287
|
-
|
193
|
+
|
288
194
|
# Optional features based on configuration
|
289
195
|
if self.show_webhook_dashboard():
|
290
196
|
items.append('webhook_dashboard')
|
291
|
-
|
197
|
+
|
292
198
|
if self.show_payment_creation():
|
293
199
|
items.append('payment_creation')
|
294
|
-
|
200
|
+
|
295
201
|
if self.show_currency_converter():
|
296
202
|
items.append('currency_converter')
|
297
|
-
|
203
|
+
|
298
204
|
if self.show_api_management():
|
299
205
|
items.extend(['api_keys_admin', 'endpoint_groups_admin'])
|
300
|
-
|
206
|
+
|
301
207
|
if self.show_subscription_management():
|
302
208
|
items.extend(['subscriptions_admin', 'tariffs_admin'])
|
303
|
-
|
209
|
+
|
304
210
|
if self.show_balance_management():
|
305
211
|
items.append('balances_admin')
|
306
|
-
|
212
|
+
|
307
213
|
if self.show_transaction_history():
|
308
214
|
items.append('transactions_admin')
|
309
|
-
|
215
|
+
|
310
216
|
return items
|
311
|
-
|
217
|
+
|
312
218
|
# API Keys access methods
|
313
219
|
def get_provider_api_config(self, provider: str) -> Dict[str, any]:
|
314
220
|
"""Get provider-specific API configuration."""
|
315
221
|
return self.api_keys.get_provider_config(provider)
|
316
|
-
|
222
|
+
|
317
223
|
def get_enabled_providers(self) -> List[str]:
|
318
224
|
"""Get list of enabled providers (those with API keys configured)."""
|
319
225
|
return self.api_keys.get_enabled_providers()
|
320
|
-
|
226
|
+
|
321
227
|
def is_provider_enabled(self, provider: str) -> bool:
|
322
228
|
"""Check if a specific provider is enabled (has API keys configured)."""
|
323
229
|
config = self.api_keys.get_provider_config(provider)
|
324
230
|
return config.get('enabled', False)
|
325
|
-
|
231
|
+
|
326
232
|
# BaseCfgAutoModule implementation
|
327
233
|
def get_smart_defaults(self):
|
328
234
|
"""Get smart default configuration for this module."""
|
329
235
|
return PaymentsConfig()
|
330
|
-
|
236
|
+
|
331
237
|
def get_module_config(self):
|
332
238
|
"""Get the final configuration for this module."""
|
333
239
|
return self
|
334
|
-
|
240
|
+
|
335
241
|
@classmethod
|
336
242
|
def get_current_config(cls) -> 'PaymentsConfig':
|
337
243
|
"""
|
338
244
|
Get current payments configuration from django-cfg.
|
339
|
-
|
245
|
+
|
340
246
|
Uses PaymentsConfigManager for consistent access.
|
341
247
|
"""
|
342
248
|
try:
|
@@ -347,10 +253,6 @@ class PaymentsConfig(BaseModel, BaseCfgAutoModule):
|
|
347
253
|
return cls()
|
348
254
|
|
349
255
|
|
350
|
-
# Export all payment configuration classes
|
351
256
|
__all__ = [
|
352
|
-
"BaseProviderConfig",
|
353
|
-
"NowPaymentsProviderConfig",
|
354
|
-
"ProviderAPIKeysConfig",
|
355
257
|
"PaymentsConfig",
|
356
258
|
]
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"""
|
2
|
+
Payment provider configurations.
|
3
|
+
|
4
|
+
Provides type-safe configuration for payment providers:
|
5
|
+
- BaseProviderConfig: Base class for all providers
|
6
|
+
- NowPaymentsProviderConfig: NowPayments provider
|
7
|
+
"""
|
8
|
+
|
9
|
+
from .base import BaseProviderConfig
|
10
|
+
from .nowpayments import NowPaymentsProviderConfig
|
11
|
+
|
12
|
+
__all__ = [
|
13
|
+
"BaseProviderConfig",
|
14
|
+
"NowPaymentsProviderConfig",
|
15
|
+
]
|