django-cfg 1.3.13__py3-none-any.whl → 1.4.3__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/agents/examples/__init__.py +3 -0
- django_cfg/apps/agents/examples/simple_example.py +161 -0
- 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/examples/__init__.py +3 -0
- django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
- 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/examples/vehicle_model_example.py +199 -0
- 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_currency/examples/__init__.py +3 -0
- django_cfg/modules/django_currency/examples/example_database_usage.py +144 -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_ipc_client/README.md +346 -0
- django_cfg/modules/django_ipc_client/__init__.py +51 -0
- django_cfg/modules/django_ipc_client/client.py +540 -0
- django_cfg/modules/django_ipc_client/config.py +207 -0
- django_cfg/modules/django_ipc_client/dashboard/README.md +517 -0
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +11 -0
- django_cfg/modules/django_ipc_client/dashboard/apps.py +22 -0
- django_cfg/modules/django_ipc_client/dashboard/monitor.py +435 -0
- django_cfg/modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js +373 -0
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/base.html +76 -0
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +200 -0
- django_cfg/modules/django_ipc_client/dashboard/urls.py +22 -0
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +9 -0
- django_cfg/modules/django_ipc_client/dashboard/views.py +251 -0
- django_cfg/modules/django_ipc_client/exceptions.py +201 -0
- 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/examples/component_class_example.html +156 -0
- 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.3.dist-info/METADATA +533 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/RECORD +432 -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.3.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/licenses/LICENSE +0 -0
@@ -13,7 +13,7 @@ from rest_framework.filters import SearchFilter, OrderingFilter
|
|
13
13
|
|
14
14
|
from django_cfg.apps.payments.admin_interface.views.base import AdminReadOnlyViewSet
|
15
15
|
from django_cfg.apps.payments.admin_interface.serializers import AdminUserSerializer
|
16
|
-
from django_cfg.modules.
|
16
|
+
from django_cfg.modules.django_logging import get_logger
|
17
17
|
|
18
18
|
logger = get_logger("admin_user_api")
|
19
19
|
|
@@ -24,7 +24,7 @@ from django_cfg.apps.payments.admin_interface.serializers import (
|
|
24
24
|
WebhookActionResultSerializer,
|
25
25
|
)
|
26
26
|
from django_cfg.apps.payments.models import UniversalPayment
|
27
|
-
from django_cfg.modules.
|
27
|
+
from django_cfg.modules.django_logging import get_logger
|
28
28
|
from django_cfg.apps.payments.services.integrations.ngrok_service import (
|
29
29
|
get_all_webhook_urls,
|
30
30
|
get_api_base_url,
|
@@ -12,7 +12,7 @@ from rest_framework.permissions import AllowAny
|
|
12
12
|
from django.utils import timezone
|
13
13
|
|
14
14
|
from django_cfg.apps.payments.admin_interface.serializers import WebhookStatsSerializer
|
15
|
-
from django_cfg.modules.
|
15
|
+
from django_cfg.modules.django_logging import get_logger
|
16
16
|
|
17
17
|
logger = get_logger("webhook_public_api")
|
18
18
|
|
@@ -16,7 +16,7 @@ from django.utils import timezone
|
|
16
16
|
from datetime import timedelta
|
17
17
|
|
18
18
|
|
19
|
-
from django_cfg.modules.
|
19
|
+
from django_cfg.modules.django_logging import get_logger
|
20
20
|
|
21
21
|
logger = get_logger("admin_api")
|
22
22
|
|
@@ -103,12 +103,39 @@ class AdminTemplateViewMixin:
|
|
103
103
|
"""
|
104
104
|
Mixin for template views requiring staff access.
|
105
105
|
"""
|
106
|
-
|
106
|
+
|
107
107
|
def get_context_data(self, **kwargs):
|
108
108
|
"""Add admin-specific context."""
|
109
|
+
from django.urls import reverse
|
110
|
+
|
109
111
|
context = super().get_context_data(**kwargs)
|
112
|
+
|
113
|
+
# Build navigation items for navbar
|
114
|
+
dashboard_url = reverse('cfg_payments_admin:dashboard')
|
115
|
+
payments_url = reverse('cfg_payments_admin:payment-list')
|
116
|
+
webhooks_url = reverse('cfg_payments_admin:webhook-dashboard')
|
117
|
+
|
118
|
+
payment_nav_items = [
|
119
|
+
{
|
120
|
+
'label': 'Dashboard',
|
121
|
+
'url': dashboard_url,
|
122
|
+
'active': self.request.path == dashboard_url or self.request.path.rstrip('/') == dashboard_url.rstrip('/'),
|
123
|
+
},
|
124
|
+
{
|
125
|
+
'label': 'Payments',
|
126
|
+
'url': payments_url,
|
127
|
+
'active': self.request.path.startswith(payments_url.rstrip('/')),
|
128
|
+
},
|
129
|
+
{
|
130
|
+
'label': 'Webhooks',
|
131
|
+
'url': webhooks_url,
|
132
|
+
'active': self.request.path.startswith(webhooks_url.rstrip('/')),
|
133
|
+
},
|
134
|
+
]
|
135
|
+
|
110
136
|
context.update({
|
111
137
|
'is_admin_interface': True,
|
112
138
|
'admin_user': self.request.user,
|
139
|
+
'payment_nav_items': payment_nav_items,
|
113
140
|
})
|
114
141
|
return context
|
django_cfg/apps/payments/apps.py
CHANGED
@@ -5,7 +5,7 @@ Simplified payment system focused on NowPayments with extensible architecture.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from django.apps import AppConfig
|
8
|
-
from django_cfg.modules.
|
8
|
+
from django_cfg.modules.django_logging import get_logger
|
9
9
|
|
10
10
|
logger = get_logger("payments")
|
11
11
|
|
@@ -6,8 +6,8 @@ and caching. All payments modules should use this for configuration access.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
from typing import Optional
|
9
|
-
from django_cfg.core.
|
10
|
-
from django_cfg.modules.
|
9
|
+
from django_cfg.core.state import get_current_config
|
10
|
+
from django_cfg.modules.django_logging import get_logger
|
11
11
|
|
12
12
|
logger = get_logger("payments_django_cfg_integration")
|
13
13
|
|
@@ -8,7 +8,7 @@ from typing import Dict, Any
|
|
8
8
|
from django.conf import settings
|
9
9
|
|
10
10
|
from .django_cfg_integration import PaymentsConfigMixin
|
11
|
-
from django_cfg.modules.
|
11
|
+
from django_cfg.modules.django_logging import get_logger
|
12
12
|
|
13
13
|
logger = get_logger("payments_config_helpers")
|
14
14
|
|
@@ -24,6 +24,7 @@ class MiddlewareConfigHelper(PaymentsConfigMixin):
|
|
24
24
|
return {
|
25
25
|
# All settings from BaseCfgAutoModule (django-cfg)
|
26
26
|
'enabled': config.enabled and config.middleware_enabled,
|
27
|
+
'api_prefixes': getattr(config, 'api_prefixes', ['/api/']),
|
27
28
|
'protected_paths': config.protected_paths,
|
28
29
|
'protected_patterns': config.protected_patterns,
|
29
30
|
'rate_limiting_enabled': config.rate_limiting_enabled,
|
@@ -31,7 +32,7 @@ class MiddlewareConfigHelper(PaymentsConfigMixin):
|
|
31
32
|
'usage_tracking_enabled': config.usage_tracking_enabled,
|
32
33
|
'track_anonymous_usage': config.track_anonymous_usage,
|
33
34
|
'cache_timeouts': config.cache_timeouts,
|
34
|
-
|
35
|
+
|
35
36
|
# Provider API configurations
|
36
37
|
'enabled_providers': config.get_enabled_providers(),
|
37
38
|
'provider_configs': {
|
@@ -13,7 +13,7 @@ from django.db import transaction
|
|
13
13
|
from django.db.models import Q, Count
|
14
14
|
from django.core.cache import cache
|
15
15
|
|
16
|
-
from django_cfg.modules.
|
16
|
+
from django_cfg.modules.django_logging import get_logger
|
17
17
|
from django_cfg.apps.payments.models import UniversalPayment, APIKey, Transaction
|
18
18
|
from django_cfg.apps.payments.services.cache_service import get_cache_service
|
19
19
|
|
@@ -13,7 +13,7 @@ from django.utils import timezone
|
|
13
13
|
from django.db.models import Q, Count, Avg, Sum, Max, Min
|
14
14
|
from django.contrib.humanize.templatetags.humanize import intcomma
|
15
15
|
|
16
|
-
from django_cfg.modules.
|
16
|
+
from django_cfg.modules.django_logging import get_logger
|
17
17
|
from django_cfg.apps.payments.models import Currency, Network, ProviderCurrency, UniversalPayment
|
18
18
|
from django_cfg.apps.payments.services.providers.registry import get_provider_registry
|
19
19
|
|
@@ -12,7 +12,7 @@ import time
|
|
12
12
|
import concurrent.futures
|
13
13
|
from threading import Lock
|
14
14
|
|
15
|
-
from django_cfg.modules.
|
15
|
+
from django_cfg.modules.django_logging import get_logger
|
16
16
|
from django_cfg.modules.django_currency import CurrencyConverter, CurrencyError
|
17
17
|
from django_cfg.apps.payments.models import Currency
|
18
18
|
|
@@ -11,7 +11,7 @@ from datetime import timedelta
|
|
11
11
|
from typing import List, Optional, Dict
|
12
12
|
import time
|
13
13
|
|
14
|
-
from django_cfg.modules.
|
14
|
+
from django_cfg.modules.django_logging import get_logger
|
15
15
|
from django_cfg.apps.payments.models import Currency, Network, ProviderCurrency
|
16
16
|
from django_cfg.apps.payments.services.providers import (
|
17
17
|
get_provider_registry,
|
@@ -13,7 +13,7 @@ from django.utils import timezone
|
|
13
13
|
from django.db import transaction
|
14
14
|
from django.db.models import Q
|
15
15
|
|
16
|
-
from django_cfg.modules.
|
16
|
+
from django_cfg.modules.django_logging import get_logger
|
17
17
|
from django_cfg.apps.payments.models import UniversalPayment
|
18
18
|
from django_cfg.apps.payments.services.providers.registry import get_provider_registry
|
19
19
|
from django_cfg.apps.payments.services.core.payment_service import PaymentService
|
@@ -11,7 +11,7 @@ import time
|
|
11
11
|
from django.core.management.base import BaseCommand, CommandError
|
12
12
|
from django.utils import timezone
|
13
13
|
|
14
|
-
from django_cfg.modules.
|
14
|
+
from django_cfg.modules.django_logging import get_logger
|
15
15
|
from django_cfg.apps.payments.services.providers.registry import get_provider_registry
|
16
16
|
from django_cfg.apps.payments.models import Currency, Network
|
17
17
|
from django_cfg.apps.payments.services.types.requests import PaymentCreateRequest
|
@@ -15,7 +15,7 @@ from django.contrib.auth import get_user_model
|
|
15
15
|
|
16
16
|
from ..models import APIKey, Subscription
|
17
17
|
from ..config.helpers import MiddlewareConfigHelper
|
18
|
-
from django_cfg.modules.
|
18
|
+
from django_cfg.modules.django_logging import get_logger
|
19
19
|
from ..tasks.usage_tracking import (
|
20
20
|
update_api_key_usage_async,
|
21
21
|
update_subscription_usage_async
|
@@ -14,7 +14,7 @@ from django.core.cache import cache
|
|
14
14
|
from datetime import datetime, timedelta
|
15
15
|
|
16
16
|
from ..config.helpers import MiddlewareConfigHelper
|
17
|
-
from django_cfg.modules.
|
17
|
+
from django_cfg.modules.django_logging import get_logger
|
18
18
|
|
19
19
|
logger = get_logger("rate_limiting_middleware")
|
20
20
|
|
@@ -12,7 +12,7 @@ from django.utils import timezone
|
|
12
12
|
from django.core.cache import cache
|
13
13
|
|
14
14
|
from ..config.helpers import MiddlewareConfigHelper
|
15
|
-
from django_cfg.modules.
|
15
|
+
from django_cfg.modules.django_logging import get_logger
|
16
16
|
|
17
17
|
logger = get_logger("usage_tracking_middleware")
|
18
18
|
|
@@ -78,11 +78,11 @@ class UserBalance(models.Model):
|
|
78
78
|
]
|
79
79
|
constraints = [
|
80
80
|
models.CheckConstraint(
|
81
|
-
|
81
|
+
condition=models.Q(balance_usd__gte=0.0),
|
82
82
|
name='balance_non_negative_check'
|
83
83
|
),
|
84
84
|
models.CheckConstraint(
|
85
|
-
|
85
|
+
condition=models.Q(reserved_usd__gte=0.0),
|
86
86
|
name='reserved_non_negative_check'
|
87
87
|
),
|
88
88
|
]
|
@@ -7,7 +7,7 @@ Optimized querysets and managers for API key operations.
|
|
7
7
|
from django.db import models
|
8
8
|
from django.utils import timezone
|
9
9
|
from datetime import timedelta
|
10
|
-
from django_cfg.modules.
|
10
|
+
from django_cfg.modules.django_logging import get_logger
|
11
11
|
|
12
12
|
logger = get_logger("api_key_managers")
|
13
13
|
|
@@ -6,7 +6,7 @@ Optimized querysets and managers for balance and transaction operations.
|
|
6
6
|
|
7
7
|
from django.db import models, transaction
|
8
8
|
from django.utils import timezone
|
9
|
-
from django_cfg.modules.
|
9
|
+
from django_cfg.modules.django_logging import get_logger
|
10
10
|
|
11
11
|
logger = get_logger("balance_managers")
|
12
12
|
|
@@ -5,7 +5,7 @@ Optimized querysets and managers for currency operations with django_currency in
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from django.db import models
|
8
|
-
from django_cfg.modules.
|
8
|
+
from django_cfg.modules.django_logging import get_logger
|
9
9
|
|
10
10
|
logger = get_logger("currency_managers")
|
11
11
|
|
@@ -10,7 +10,7 @@ from datetime import datetime
|
|
10
10
|
from django.db import models
|
11
11
|
from django.utils import timezone
|
12
12
|
from pydantic import BaseModel, Field, ConfigDict
|
13
|
-
from django_cfg.modules.
|
13
|
+
from django_cfg.modules.django_logging import get_logger
|
14
14
|
|
15
15
|
logger = get_logger("payment_managers")
|
16
16
|
|
@@ -7,7 +7,7 @@ Optimized querysets and managers for subscription and endpoint group operations.
|
|
7
7
|
from django.db import models
|
8
8
|
from django.utils import timezone
|
9
9
|
from datetime import timedelta
|
10
|
-
from django_cfg.modules.
|
10
|
+
from django_cfg.modules.django_logging import get_logger
|
11
11
|
|
12
12
|
logger = get_logger("subscription_managers")
|
13
13
|
|
@@ -238,11 +238,11 @@ class UniversalPayment(UUIDTimestampedModel):
|
|
238
238
|
]
|
239
239
|
constraints = [
|
240
240
|
models.CheckConstraint(
|
241
|
-
|
241
|
+
condition=models.Q(amount_usd__gte=1.0),
|
242
242
|
name='payments_min_amount_check'
|
243
243
|
),
|
244
244
|
models.CheckConstraint(
|
245
|
-
|
245
|
+
condition=models.Q(amount_usd__lte=50000.0),
|
246
246
|
name='payments_max_amount_check'
|
247
247
|
),
|
248
248
|
]
|
@@ -8,7 +8,7 @@ ONLY for API access control - NOT payment data!
|
|
8
8
|
|
9
9
|
from typing import Dict, Any
|
10
10
|
from django.core.cache import cache
|
11
|
-
from django_cfg.modules.
|
11
|
+
from django_cfg.modules.django_logging import get_logger
|
12
12
|
|
13
13
|
from .interfaces import CacheInterface
|
14
14
|
from .simple_cache import SimpleCache
|
@@ -6,7 +6,7 @@ Basic cache functionality with graceful fallback.
|
|
6
6
|
|
7
7
|
from typing import Optional, Any
|
8
8
|
from django.core.cache import cache
|
9
|
-
from django_cfg.modules.
|
9
|
+
from django_cfg.modules.django_logging import get_logger
|
10
10
|
|
11
11
|
from .interfaces import CacheInterface
|
12
12
|
|
@@ -29,15 +29,20 @@ class SimpleCache(CacheInterface):
|
|
29
29
|
"""Check if cache is enabled via PaymentsConfig."""
|
30
30
|
from django.conf import settings
|
31
31
|
import sys
|
32
|
-
|
32
|
+
import os
|
33
|
+
|
33
34
|
# For tests, always enable cache (detect test environment)
|
34
|
-
|
35
|
+
# Check multiple ways to detect test environment
|
36
|
+
if ('test' in sys.argv or
|
37
|
+
hasattr(settings, 'TESTING') or
|
38
|
+
'pytest' in sys.modules or
|
39
|
+
'PYTEST_CURRENT_TEST' in os.environ):
|
35
40
|
return True
|
36
|
-
|
41
|
+
|
37
42
|
# For development, enable by default
|
38
43
|
if settings.DEBUG:
|
39
44
|
return True
|
40
|
-
|
45
|
+
|
41
46
|
try:
|
42
47
|
from django_cfg.models.payments import PaymentsConfig
|
43
48
|
config = PaymentsConfig.get_current_config()
|
@@ -7,7 +7,7 @@ Provides common functionality for all services.
|
|
7
7
|
from abc import ABC
|
8
8
|
from typing import Optional, Dict, Any, Type
|
9
9
|
from django.db import transaction
|
10
|
-
from django_cfg.modules.
|
10
|
+
from django_cfg.modules.django_logging import get_logger
|
11
11
|
|
12
12
|
from ..types import ServiceOperationResult
|
13
13
|
from ...config.django_cfg_integration import PaymentsConfigManager
|
@@ -0,0 +1,13 @@
|
|
1
|
+
"""
|
2
|
+
Currency operations for payment service.
|
3
|
+
|
4
|
+
Provides currency validation and conversion functionality.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from .currency_validator import CurrencyValidator
|
8
|
+
from .currency_converter import CurrencyConverter
|
9
|
+
|
10
|
+
__all__ = [
|
11
|
+
'CurrencyValidator',
|
12
|
+
'CurrencyConverter',
|
13
|
+
]
|
@@ -0,0 +1,57 @@
|
|
1
|
+
"""
|
2
|
+
Currency conversion.
|
3
|
+
|
4
|
+
Converts between USD and cryptocurrencies using exchange rates.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from decimal import Decimal
|
8
|
+
from django_cfg.modules.django_currency import convert_currency, get_exchange_rate
|
9
|
+
from ...types import ServiceOperationResult
|
10
|
+
|
11
|
+
|
12
|
+
class CurrencyConverter:
|
13
|
+
"""Convert between currencies."""
|
14
|
+
|
15
|
+
def __init__(self, base_service):
|
16
|
+
"""
|
17
|
+
Initialize converter.
|
18
|
+
|
19
|
+
Args:
|
20
|
+
base_service: Base service instance for error/success result creation
|
21
|
+
"""
|
22
|
+
self.base_service = base_service
|
23
|
+
|
24
|
+
def convert_usd_to_crypto(
|
25
|
+
self,
|
26
|
+
amount_usd: float,
|
27
|
+
currency_code: str
|
28
|
+
) -> ServiceOperationResult:
|
29
|
+
"""
|
30
|
+
Convert USD amount to cryptocurrency.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
amount_usd: Amount in USD
|
34
|
+
currency_code: Target cryptocurrency code
|
35
|
+
|
36
|
+
Returns:
|
37
|
+
ServiceOperationResult with conversion data or error
|
38
|
+
"""
|
39
|
+
try:
|
40
|
+
# Use django_currency module for conversion
|
41
|
+
crypto_amount = convert_currency(amount_usd, 'USD', currency_code)
|
42
|
+
|
43
|
+
return self.base_service._create_success_result(
|
44
|
+
"Currency converted successfully",
|
45
|
+
{
|
46
|
+
'amount_usd': amount_usd,
|
47
|
+
'crypto_amount': Decimal(str(crypto_amount)),
|
48
|
+
'currency_code': currency_code,
|
49
|
+
'exchange_rate': get_exchange_rate('USD', currency_code)
|
50
|
+
}
|
51
|
+
)
|
52
|
+
|
53
|
+
except Exception as e:
|
54
|
+
return self.base_service._create_error_result(
|
55
|
+
f"Currency conversion failed: {e}",
|
56
|
+
"conversion_failed"
|
57
|
+
)
|
@@ -0,0 +1,61 @@
|
|
1
|
+
"""
|
2
|
+
Currency validation.
|
3
|
+
|
4
|
+
Validates that currencies are active and supported by providers.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from ....models import Currency, ProviderCurrency
|
8
|
+
from ...types import ServiceOperationResult
|
9
|
+
|
10
|
+
|
11
|
+
class CurrencyValidator:
|
12
|
+
"""Validate currencies for payment operations."""
|
13
|
+
|
14
|
+
def __init__(self, base_service):
|
15
|
+
"""
|
16
|
+
Initialize validator.
|
17
|
+
|
18
|
+
Args:
|
19
|
+
base_service: Base service instance for error/success result creation
|
20
|
+
"""
|
21
|
+
self.base_service = base_service
|
22
|
+
|
23
|
+
def validate_currency(self, currency_code: str) -> ServiceOperationResult:
|
24
|
+
"""
|
25
|
+
Validate currency is supported.
|
26
|
+
|
27
|
+
Checks that:
|
28
|
+
1. Currency exists and is active
|
29
|
+
2. Currency is supported by at least one provider
|
30
|
+
|
31
|
+
Args:
|
32
|
+
currency_code: Currency code to validate (e.g., 'BTC', 'ETH')
|
33
|
+
|
34
|
+
Returns:
|
35
|
+
ServiceOperationResult with currency data or error
|
36
|
+
"""
|
37
|
+
try:
|
38
|
+
currency = Currency.objects.get(code=currency_code, is_active=True)
|
39
|
+
|
40
|
+
# Check if currency is supported by any provider
|
41
|
+
provider_currency = ProviderCurrency.objects.filter(
|
42
|
+
currency=currency,
|
43
|
+
is_enabled=True
|
44
|
+
).first()
|
45
|
+
|
46
|
+
if not provider_currency:
|
47
|
+
return self.base_service._create_error_result(
|
48
|
+
f"Currency {currency_code} not supported by any provider",
|
49
|
+
"currency_not_supported"
|
50
|
+
)
|
51
|
+
|
52
|
+
return self.base_service._create_success_result(
|
53
|
+
"Currency is valid",
|
54
|
+
{'currency': currency} # Wrap in dict for Pydantic
|
55
|
+
)
|
56
|
+
|
57
|
+
except Currency.DoesNotExist:
|
58
|
+
return self.base_service._create_error_result(
|
59
|
+
f"Currency {currency_code} not found",
|
60
|
+
"currency_not_found"
|
61
|
+
)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"""
|
2
|
+
Payment operations.
|
3
|
+
|
4
|
+
Core payment business logic operations.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from .payment_creator import PaymentCreator
|
8
|
+
from .payment_canceller import PaymentCanceller
|
9
|
+
from .status_checker import StatusChecker
|
10
|
+
|
11
|
+
__all__ = [
|
12
|
+
'PaymentCreator',
|
13
|
+
'PaymentCanceller',
|
14
|
+
'StatusChecker',
|
15
|
+
]
|
@@ -0,0 +1,100 @@
|
|
1
|
+
"""
|
2
|
+
Payment cancellation logic.
|
3
|
+
|
4
|
+
Handles payment cancellation with validation.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import TYPE_CHECKING
|
8
|
+
from ...types import PaymentResult
|
9
|
+
from ..utils import DataConverter
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from ....models import UniversalPayment
|
13
|
+
|
14
|
+
|
15
|
+
class PaymentCanceller:
|
16
|
+
"""Handle payment cancellation."""
|
17
|
+
|
18
|
+
def __init__(self, base_service):
|
19
|
+
"""
|
20
|
+
Initialize canceller.
|
21
|
+
|
22
|
+
Args:
|
23
|
+
base_service: Base service for transactions, logging, and result creation
|
24
|
+
"""
|
25
|
+
self.base_service = base_service
|
26
|
+
self.logger = base_service.logger
|
27
|
+
|
28
|
+
def cancel_payment(self, payment_id: str, reason: str = None) -> PaymentResult:
|
29
|
+
"""
|
30
|
+
Cancel payment if possible.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
payment_id: Payment ID to cancel
|
34
|
+
reason: Cancellation reason
|
35
|
+
|
36
|
+
Returns:
|
37
|
+
PaymentResult: Cancellation result
|
38
|
+
"""
|
39
|
+
try:
|
40
|
+
from ....models import UniversalPayment
|
41
|
+
|
42
|
+
self.logger.info("Cancelling payment", extra={
|
43
|
+
'payment_id': payment_id,
|
44
|
+
'reason': reason
|
45
|
+
})
|
46
|
+
|
47
|
+
# Get payment
|
48
|
+
try:
|
49
|
+
payment = UniversalPayment.objects.get(id=payment_id)
|
50
|
+
except UniversalPayment.DoesNotExist:
|
51
|
+
return PaymentResult(
|
52
|
+
success=False,
|
53
|
+
message=f"Payment {payment_id} not found",
|
54
|
+
error_code="payment_not_found"
|
55
|
+
)
|
56
|
+
|
57
|
+
# Check if payment can be cancelled
|
58
|
+
if not payment.can_be_cancelled():
|
59
|
+
return PaymentResult(
|
60
|
+
success=False,
|
61
|
+
message=f"Payment {payment_id} cannot be cancelled (status: {payment.status})",
|
62
|
+
error_code="cannot_cancel"
|
63
|
+
)
|
64
|
+
|
65
|
+
# Cancel using manager
|
66
|
+
def cancel_payment_transaction():
|
67
|
+
return payment.cancel(reason)
|
68
|
+
|
69
|
+
success = self.base_service._execute_with_transaction(cancel_payment_transaction)
|
70
|
+
|
71
|
+
if success:
|
72
|
+
payment.refresh_from_db()
|
73
|
+
payment_data = DataConverter.payment_to_data(payment)
|
74
|
+
|
75
|
+
self.base_service._log_operation(
|
76
|
+
"cancel_payment",
|
77
|
+
True,
|
78
|
+
payment_id=payment_id,
|
79
|
+
reason=reason
|
80
|
+
)
|
81
|
+
|
82
|
+
return PaymentResult(
|
83
|
+
success=True,
|
84
|
+
message="Payment cancelled successfully",
|
85
|
+
payment_id=str(payment.id),
|
86
|
+
status=payment.status,
|
87
|
+
data={'payment': payment_data.model_dump()}
|
88
|
+
)
|
89
|
+
else:
|
90
|
+
return PaymentResult(
|
91
|
+
success=False,
|
92
|
+
message="Failed to cancel payment",
|
93
|
+
error_code="cancel_failed"
|
94
|
+
)
|
95
|
+
|
96
|
+
except Exception as e:
|
97
|
+
return PaymentResult(**self.base_service._handle_exception(
|
98
|
+
"cancel_payment", e,
|
99
|
+
payment_id=payment_id
|
100
|
+
).model_dump())
|