django-cfg 1.4.21__py3-none-any.whl → 1.4.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -5,13 +5,16 @@ Abstract base class for all payment providers with unified interface.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from abc import ABC, abstractmethod
|
8
|
-
from typing import Dict, Any, Optional
|
9
8
|
from decimal import Decimal
|
9
|
+
from typing import Any, Dict, Optional
|
10
|
+
|
10
11
|
import requests
|
11
12
|
from django.utils import timezone
|
13
|
+
|
12
14
|
from django_cfg.modules.django_logging import get_logger
|
15
|
+
|
13
16
|
from ..types import ProviderResponse, ServiceOperationResult
|
14
|
-
from .models import
|
17
|
+
from .models import PaymentRequest, ProviderConfig, WithdrawalRequest
|
15
18
|
|
16
19
|
|
17
20
|
class BaseProvider(ABC):
|
@@ -20,7 +23,7 @@ class BaseProvider(ABC):
|
|
20
23
|
|
21
24
|
Defines the unified interface that all providers must implement.
|
22
25
|
"""
|
23
|
-
|
26
|
+
|
24
27
|
def __init__(self, config: ProviderConfig):
|
25
28
|
"""
|
26
29
|
Initialize provider with configuration.
|
@@ -31,17 +34,17 @@ class BaseProvider(ABC):
|
|
31
34
|
self.config = config
|
32
35
|
self.logger = get_logger(f"providers.{config.provider_name}")
|
33
36
|
self._session = None
|
34
|
-
|
37
|
+
|
35
38
|
@property
|
36
39
|
def name(self) -> str:
|
37
40
|
"""Get provider name."""
|
38
41
|
return self.config.provider_name
|
39
|
-
|
42
|
+
|
40
43
|
@property
|
41
44
|
def is_sandbox(self) -> bool:
|
42
45
|
"""Check if provider is in sandbox mode."""
|
43
46
|
return self.config.sandbox_mode
|
44
|
-
|
47
|
+
|
45
48
|
# Provider configuration methods (to be overridden by specific providers)
|
46
49
|
def get_fee_percentage(self, currency_code: str = None, currency_type: str = None) -> Decimal:
|
47
50
|
"""
|
@@ -55,7 +58,7 @@ class BaseProvider(ABC):
|
|
55
58
|
Fee percentage as decimal (0.005 = 0.5%)
|
56
59
|
"""
|
57
60
|
return Decimal('0.005') # Default 0.5%
|
58
|
-
|
61
|
+
|
59
62
|
def get_fixed_fee_usd(self, currency_code: str = None, currency_type: str = None) -> Decimal:
|
60
63
|
"""
|
61
64
|
Get fixed fee in USD for currency.
|
@@ -68,7 +71,7 @@ class BaseProvider(ABC):
|
|
68
71
|
Fixed fee in USD
|
69
72
|
"""
|
70
73
|
return Decimal('0.0') # Default no fixed fee
|
71
|
-
|
74
|
+
|
72
75
|
def get_min_amount_usd(self, currency_code: str = None, currency_type: str = None, is_stable: bool = False) -> Decimal:
|
73
76
|
"""
|
74
77
|
Get minimum amount in USD for currency.
|
@@ -87,7 +90,7 @@ class BaseProvider(ABC):
|
|
87
90
|
return Decimal('0.01')
|
88
91
|
else:
|
89
92
|
return Decimal('0.000001')
|
90
|
-
|
93
|
+
|
91
94
|
def get_max_amount_usd(self, currency_code: str = None, currency_type: str = None) -> Decimal:
|
92
95
|
"""
|
93
96
|
Get maximum amount in USD for currency.
|
@@ -100,7 +103,7 @@ class BaseProvider(ABC):
|
|
100
103
|
Maximum amount in USD
|
101
104
|
"""
|
102
105
|
return Decimal('1000000.0') # Default 1M USD
|
103
|
-
|
106
|
+
|
104
107
|
def get_confirmation_blocks(self, network_code: str) -> int:
|
105
108
|
"""
|
106
109
|
Get confirmation blocks for network.
|
@@ -112,7 +115,7 @@ class BaseProvider(ABC):
|
|
112
115
|
Number of confirmation blocks
|
113
116
|
"""
|
114
117
|
return 1 # Default 1 confirmation
|
115
|
-
|
118
|
+
|
116
119
|
def get_network_name(self, network_code: str) -> str:
|
117
120
|
"""
|
118
121
|
Get human-readable network name.
|
@@ -124,7 +127,7 @@ class BaseProvider(ABC):
|
|
124
127
|
Human-readable network name
|
125
128
|
"""
|
126
129
|
return network_code.upper() if network_code else 'Unknown'
|
127
|
-
|
130
|
+
|
128
131
|
@abstractmethod
|
129
132
|
def create_payment(self, request: PaymentRequest) -> ProviderResponse:
|
130
133
|
"""
|
@@ -137,7 +140,7 @@ class BaseProvider(ABC):
|
|
137
140
|
ProviderResponse: Provider response with payment details
|
138
141
|
"""
|
139
142
|
pass
|
140
|
-
|
143
|
+
|
141
144
|
@abstractmethod
|
142
145
|
def get_payment_status(self, provider_payment_id: str) -> ProviderResponse:
|
143
146
|
"""
|
@@ -150,7 +153,7 @@ class BaseProvider(ABC):
|
|
150
153
|
ProviderResponse: Current payment status
|
151
154
|
"""
|
152
155
|
pass
|
153
|
-
|
156
|
+
|
154
157
|
def refresh_payment_status(self, provider_payment_id: str, force_update: bool = True) -> ProviderResponse:
|
155
158
|
"""
|
156
159
|
Refresh payment status with enhanced error handling and caching control.
|
@@ -172,11 +175,11 @@ class BaseProvider(ABC):
|
|
172
175
|
'payment_id': provider_payment_id,
|
173
176
|
'force_update': force_update
|
174
177
|
})
|
175
|
-
|
178
|
+
|
176
179
|
try:
|
177
180
|
# Call the provider-specific implementation
|
178
181
|
result = self.get_payment_status(provider_payment_id)
|
179
|
-
|
182
|
+
|
180
183
|
# Add refresh metadata
|
181
184
|
if result.success and hasattr(result, 'raw_response') and result.raw_response:
|
182
185
|
result.raw_response['_refresh_metadata'] = {
|
@@ -184,28 +187,28 @@ class BaseProvider(ABC):
|
|
184
187
|
'provider': self.name,
|
185
188
|
'force_update': force_update
|
186
189
|
}
|
187
|
-
|
188
|
-
self.logger.info(
|
190
|
+
|
191
|
+
self.logger.info("Payment status refreshed successfully", extra={
|
189
192
|
'provider': self.name,
|
190
193
|
'payment_id': provider_payment_id,
|
191
194
|
'status': getattr(result, 'status', 'unknown')
|
192
195
|
})
|
193
|
-
|
196
|
+
|
194
197
|
return result
|
195
|
-
|
198
|
+
|
196
199
|
except Exception as e:
|
197
|
-
self.logger.error(
|
200
|
+
self.logger.error("Failed to refresh payment status", extra={
|
198
201
|
'provider': self.name,
|
199
202
|
'payment_id': provider_payment_id,
|
200
203
|
'error': str(e)
|
201
204
|
})
|
202
|
-
|
205
|
+
|
203
206
|
return ProviderResponse(
|
204
207
|
success=False,
|
205
208
|
error_message=f"Failed to refresh payment status: {str(e)}",
|
206
209
|
raw_response={'error': str(e), 'provider': self.name}
|
207
210
|
)
|
208
|
-
|
211
|
+
|
209
212
|
@abstractmethod
|
210
213
|
def get_supported_currencies(self) -> ServiceOperationResult:
|
211
214
|
"""
|
@@ -215,7 +218,7 @@ class BaseProvider(ABC):
|
|
215
218
|
ServiceOperationResult: List of supported currencies
|
216
219
|
"""
|
217
220
|
pass
|
218
|
-
|
221
|
+
|
219
222
|
@abstractmethod
|
220
223
|
def sync_currencies_to_db(self):
|
221
224
|
"""
|
@@ -225,7 +228,7 @@ class BaseProvider(ABC):
|
|
225
228
|
CurrencySyncResult: Synchronization result
|
226
229
|
"""
|
227
230
|
pass
|
228
|
-
|
231
|
+
|
229
232
|
@abstractmethod
|
230
233
|
def validate_webhook(self, payload: Dict[str, Any], signature: str = None) -> ServiceOperationResult:
|
231
234
|
"""
|
@@ -239,9 +242,9 @@ class BaseProvider(ABC):
|
|
239
242
|
ServiceOperationResult: Validation result
|
240
243
|
"""
|
241
244
|
pass
|
242
|
-
|
245
|
+
|
243
246
|
# Withdrawal/Payout Methods
|
244
|
-
|
247
|
+
|
245
248
|
def supports_withdrawals(self) -> bool:
|
246
249
|
"""
|
247
250
|
Check if provider supports withdrawals/payouts.
|
@@ -250,7 +253,7 @@ class BaseProvider(ABC):
|
|
250
253
|
bool: True if provider supports withdrawals
|
251
254
|
"""
|
252
255
|
return False # Default: most payment processors don't support withdrawals
|
253
|
-
|
256
|
+
|
254
257
|
def create_withdrawal(self, request: WithdrawalRequest) -> ProviderResponse:
|
255
258
|
"""
|
256
259
|
Create withdrawal/payout request with provider.
|
@@ -270,9 +273,9 @@ class BaseProvider(ABC):
|
|
270
273
|
error_message=f"Provider {self.name} does not support withdrawals",
|
271
274
|
raw_response={'error': 'withdrawals_not_supported'}
|
272
275
|
)
|
273
|
-
|
276
|
+
|
274
277
|
raise NotImplementedError("Subclasses must implement create_withdrawal if they support withdrawals")
|
275
|
-
|
278
|
+
|
276
279
|
def get_withdrawal_status(self, provider_withdrawal_id: str) -> ProviderResponse:
|
277
280
|
"""
|
278
281
|
Get withdrawal status from provider.
|
@@ -292,9 +295,9 @@ class BaseProvider(ABC):
|
|
292
295
|
error_message=f"Provider {self.name} does not support withdrawals",
|
293
296
|
raw_response={'error': 'withdrawals_not_supported'}
|
294
297
|
)
|
295
|
-
|
298
|
+
|
296
299
|
raise NotImplementedError("Subclasses must implement get_withdrawal_status if they support withdrawals")
|
297
|
-
|
300
|
+
|
298
301
|
def cancel_withdrawal(self, provider_withdrawal_id: str) -> ProviderResponse:
|
299
302
|
"""
|
300
303
|
Cancel pending withdrawal.
|
@@ -314,13 +317,13 @@ class BaseProvider(ABC):
|
|
314
317
|
error_message=f"Provider {self.name} does not support withdrawals",
|
315
318
|
raw_response={'error': 'withdrawals_not_supported'}
|
316
319
|
)
|
317
|
-
|
320
|
+
|
318
321
|
return ProviderResponse(
|
319
322
|
success=False,
|
320
323
|
error_message=f"Provider {self.name} does not support withdrawal cancellation",
|
321
324
|
raw_response={'error': 'withdrawal_cancellation_not_supported'}
|
322
325
|
)
|
323
|
-
|
326
|
+
|
324
327
|
def get_withdrawal_fees(self, currency_code: str) -> ServiceOperationResult:
|
325
328
|
"""
|
326
329
|
Get withdrawal fees for specific currency.
|
@@ -336,12 +339,12 @@ class BaseProvider(ABC):
|
|
336
339
|
success=False,
|
337
340
|
message=f"Provider {self.name} does not support withdrawals"
|
338
341
|
)
|
339
|
-
|
342
|
+
|
340
343
|
return ServiceOperationResult(
|
341
344
|
success=False,
|
342
345
|
message="Withdrawal fee information not available"
|
343
346
|
)
|
344
|
-
|
347
|
+
|
345
348
|
def get_minimum_withdrawal_amount(self, currency_code: str) -> ServiceOperationResult:
|
346
349
|
"""
|
347
350
|
Get minimum withdrawal amount for specific currency.
|
@@ -357,12 +360,12 @@ class BaseProvider(ABC):
|
|
357
360
|
success=False,
|
358
361
|
message=f"Provider {self.name} does not support withdrawals"
|
359
362
|
)
|
360
|
-
|
363
|
+
|
361
364
|
return ServiceOperationResult(
|
362
365
|
success=False,
|
363
366
|
message="Minimum withdrawal amount information not available"
|
364
367
|
)
|
365
|
-
|
368
|
+
|
366
369
|
def get_exchange_rate(self, from_currency: str, to_currency: str) -> ServiceOperationResult:
|
367
370
|
"""
|
368
371
|
Get exchange rate from provider (optional).
|
@@ -379,7 +382,7 @@ class BaseProvider(ABC):
|
|
379
382
|
message=f"Exchange rates not supported by {self.name}",
|
380
383
|
error_code="not_supported"
|
381
384
|
)
|
382
|
-
|
385
|
+
|
383
386
|
def health_check(self) -> ServiceOperationResult:
|
384
387
|
"""
|
385
388
|
Perform provider health check.
|
@@ -390,7 +393,7 @@ class BaseProvider(ABC):
|
|
390
393
|
try:
|
391
394
|
# Basic connectivity test - can be overridden by providers
|
392
395
|
result = self.get_supported_currencies()
|
393
|
-
|
396
|
+
|
394
397
|
if result.success:
|
395
398
|
return ServiceOperationResult(
|
396
399
|
success=True,
|
@@ -409,7 +412,7 @@ class BaseProvider(ABC):
|
|
409
412
|
error_code="health_check_failed",
|
410
413
|
data={'provider': self.name, 'error': result.message}
|
411
414
|
)
|
412
|
-
|
415
|
+
|
413
416
|
except Exception as e:
|
414
417
|
self.logger.error(f"Health check failed for {self.name}: {e}")
|
415
418
|
return ServiceOperationResult(
|
@@ -418,7 +421,7 @@ class BaseProvider(ABC):
|
|
418
421
|
error_code="health_check_error",
|
419
422
|
data={'provider': self.name}
|
420
423
|
)
|
421
|
-
|
424
|
+
|
422
425
|
def _make_request(
|
423
426
|
self,
|
424
427
|
method: str,
|
@@ -441,14 +444,13 @@ class BaseProvider(ABC):
|
|
441
444
|
Raises:
|
442
445
|
Exception: If request fails
|
443
446
|
"""
|
444
|
-
import requests
|
445
447
|
from requests.adapters import HTTPAdapter
|
446
448
|
from urllib3.util.retry import Retry
|
447
|
-
|
449
|
+
|
448
450
|
# Create session if not exists
|
449
451
|
if self._session is None:
|
450
452
|
self._session = requests.Session()
|
451
|
-
|
453
|
+
|
452
454
|
# Configure retries
|
453
455
|
retry_strategy = Retry(
|
454
456
|
total=self.config.retry_attempts,
|
@@ -458,10 +460,10 @@ class BaseProvider(ABC):
|
|
458
460
|
adapter = HTTPAdapter(max_retries=retry_strategy)
|
459
461
|
self._session.mount("http://", adapter)
|
460
462
|
self._session.mount("https://", adapter)
|
461
|
-
|
463
|
+
|
462
464
|
# Build URL
|
463
465
|
url = f"{self.config.api_url.rstrip('/')}/{endpoint.lstrip('/')}"
|
464
|
-
|
466
|
+
|
465
467
|
# Prepare headers
|
466
468
|
request_headers = {
|
467
469
|
'Content-Type': 'application/json',
|
@@ -469,14 +471,14 @@ class BaseProvider(ABC):
|
|
469
471
|
}
|
470
472
|
if headers:
|
471
473
|
request_headers.update(headers)
|
472
|
-
|
474
|
+
|
473
475
|
# Log request
|
474
476
|
self.logger.debug(f"Making {method} request to {url}", extra={
|
475
477
|
'method': method,
|
476
478
|
'url': url,
|
477
479
|
'has_data': bool(data)
|
478
480
|
})
|
479
|
-
|
481
|
+
|
480
482
|
# Make request
|
481
483
|
response = self._session.request(
|
482
484
|
method=method,
|
@@ -485,17 +487,17 @@ class BaseProvider(ABC):
|
|
485
487
|
headers=request_headers,
|
486
488
|
timeout=self.config.timeout
|
487
489
|
)
|
488
|
-
|
490
|
+
|
489
491
|
# Log response
|
490
492
|
self.logger.debug(f"Received response: {response.status_code}", extra={
|
491
493
|
'status_code': response.status_code,
|
492
494
|
'response_size': len(response.content)
|
493
495
|
})
|
494
|
-
|
496
|
+
|
495
497
|
# Handle response
|
496
498
|
try:
|
497
499
|
response.raise_for_status()
|
498
|
-
except requests.exceptions.HTTPError
|
500
|
+
except requests.exceptions.HTTPError:
|
499
501
|
# Log the error with response content for debugging
|
500
502
|
error_content = response.text if response.text else "No response content"
|
501
503
|
self.logger.error(f"HTTP {response.status_code} error from {self.name}", extra={
|
@@ -503,7 +505,7 @@ class BaseProvider(ABC):
|
|
503
505
|
'error_content': error_content[:500], # Limit content length
|
504
506
|
'url': response.url
|
505
507
|
})
|
506
|
-
|
508
|
+
|
507
509
|
# Handle specific HTTP errors
|
508
510
|
if response.status_code == 403:
|
509
511
|
if "blocked" in error_content.lower() or "nowpayments.io" in error_content:
|
@@ -520,13 +522,13 @@ class BaseProvider(ABC):
|
|
520
522
|
raise Exception(f"{self.name} server error ({response.status_code}). Please try again later.")
|
521
523
|
else:
|
522
524
|
raise Exception(f"HTTP {response.status_code} error from {self.name}: {error_content[:200]}")
|
523
|
-
|
525
|
+
|
524
526
|
try:
|
525
527
|
return response.json()
|
526
528
|
except ValueError:
|
527
529
|
# Non-JSON response
|
528
530
|
return {'raw_response': response.text, 'status_code': response.status_code}
|
529
|
-
|
531
|
+
|
530
532
|
def _create_provider_response(
|
531
533
|
self,
|
532
534
|
success: bool,
|
@@ -550,11 +552,11 @@ class BaseProvider(ABC):
|
|
550
552
|
raw_response=raw_response,
|
551
553
|
**kwargs
|
552
554
|
)
|
553
|
-
|
555
|
+
|
554
556
|
def __str__(self) -> str:
|
555
557
|
"""String representation."""
|
556
558
|
return f"{self.name}Provider(sandbox={self.is_sandbox})"
|
557
|
-
|
559
|
+
|
558
560
|
def __repr__(self) -> str:
|
559
561
|
"""Detailed representation."""
|
560
562
|
return f"{self.__class__.__name__}(name='{self.name}', sandbox={self.is_sandbox}, api_url='{self.config.api_url}')"
|
@@ -5,22 +5,15 @@ Common models used across all payment providers.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from .base import (
|
8
|
-
ProviderConfig,
|
9
8
|
PaymentRequest,
|
10
|
-
|
9
|
+
ProviderConfig,
|
11
10
|
ProviderMetadata,
|
11
|
+
ProviderStatus,
|
12
12
|
ProviderType,
|
13
|
-
|
14
|
-
)
|
15
|
-
from .universal import (
|
16
|
-
UniversalCurrency,
|
17
|
-
UniversalCurrenciesResponse,
|
18
|
-
CurrencySyncResult
|
19
|
-
)
|
20
|
-
from .providers import (
|
21
|
-
ProviderEnum,
|
22
|
-
PROVIDER_METADATA
|
13
|
+
WithdrawalRequest,
|
23
14
|
)
|
15
|
+
from .providers import PROVIDER_METADATA, ProviderEnum
|
16
|
+
from .universal import CurrencySyncResult, UniversalCurrenciesResponse, UniversalCurrency
|
24
17
|
|
25
18
|
__all__ = [
|
26
19
|
# Base models
|
@@ -30,12 +23,12 @@ __all__ = [
|
|
30
23
|
'ProviderMetadata',
|
31
24
|
'ProviderType',
|
32
25
|
'ProviderStatus',
|
33
|
-
|
26
|
+
|
34
27
|
# Universal models
|
35
28
|
'UniversalCurrency',
|
36
29
|
'UniversalCurrenciesResponse',
|
37
30
|
'CurrencySyncResult',
|
38
|
-
|
31
|
+
|
39
32
|
# Provider definitions
|
40
33
|
'ProviderEnum',
|
41
34
|
'PROVIDER_METADATA'
|
@@ -4,15 +4,15 @@ Base provider models for Universal Payment System v2.0.
|
|
4
4
|
Core Pydantic models for provider configuration and requests.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import Dict, Any, Optional, List
|
8
|
-
from decimal import Decimal
|
9
|
-
from pydantic import BaseModel, Field, ConfigDict
|
10
7
|
from enum import Enum
|
8
|
+
from typing import Any, Dict, List, Optional
|
9
|
+
|
10
|
+
from pydantic import BaseModel, ConfigDict, Field
|
11
11
|
|
12
12
|
|
13
13
|
class ProviderType(str, Enum):
|
14
14
|
"""Provider type classification."""
|
15
|
-
|
15
|
+
|
16
16
|
CRYPTO = "crypto"
|
17
17
|
FIAT = "fiat"
|
18
18
|
HYBRID = "hybrid" # Supports both fiat and crypto
|
@@ -20,7 +20,7 @@ class ProviderType(str, Enum):
|
|
20
20
|
|
21
21
|
class ProviderStatus(str, Enum):
|
22
22
|
"""Provider operational status."""
|
23
|
-
|
23
|
+
|
24
24
|
ACTIVE = "active"
|
25
25
|
MAINTENANCE = "maintenance"
|
26
26
|
DEPRECATED = "deprecated"
|
@@ -39,7 +39,7 @@ class ProviderConfig(BaseModel):
|
|
39
39
|
str_strip_whitespace=True,
|
40
40
|
frozen=False
|
41
41
|
)
|
42
|
-
|
42
|
+
|
43
43
|
provider_name: str = Field(..., description="Provider name")
|
44
44
|
api_key: str = Field(..., description="Provider API key")
|
45
45
|
api_url: str = Field(..., description="Provider API URL")
|
@@ -65,7 +65,7 @@ class PaymentRequest(BaseModel):
|
|
65
65
|
extra="forbid",
|
66
66
|
str_strip_whitespace=True
|
67
67
|
)
|
68
|
-
|
68
|
+
|
69
69
|
amount_usd: float = Field(..., gt=0, description="Amount in USD")
|
70
70
|
currency_code: str = Field(..., min_length=3, max_length=10, description="Currency code")
|
71
71
|
order_id: str = Field(..., min_length=1, max_length=100, description="Internal order/payment ID")
|
@@ -87,7 +87,7 @@ class WithdrawalRequest(BaseModel):
|
|
87
87
|
extra="forbid",
|
88
88
|
str_strip_whitespace=True
|
89
89
|
)
|
90
|
-
|
90
|
+
|
91
91
|
amount: float = Field(..., gt=0, description="Withdrawal amount in crypto currency")
|
92
92
|
currency_code: str = Field(..., min_length=3, max_length=10, description="Cryptocurrency code")
|
93
93
|
destination_address: str = Field(..., min_length=10, description="Destination wallet address")
|
@@ -96,7 +96,7 @@ class WithdrawalRequest(BaseModel):
|
|
96
96
|
description: Optional[str] = Field(None, max_length=500, description="Withdrawal description")
|
97
97
|
extra_id: Optional[str] = Field(None, description="Extra ID for destination (memo, tag, etc.)")
|
98
98
|
priority: Optional[str] = Field(default="normal", description="Transaction priority (low, normal, high)")
|
99
|
-
|
99
|
+
|
100
100
|
metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
|
101
101
|
|
102
102
|
|
@@ -111,35 +111,35 @@ class ProviderMetadata(BaseModel):
|
|
111
111
|
extra="forbid",
|
112
112
|
frozen=True # Metadata should be immutable
|
113
113
|
)
|
114
|
-
|
114
|
+
|
115
115
|
name: str = Field(..., description="Human-readable provider name")
|
116
116
|
provider_type: ProviderType = Field(..., description="Provider type (crypto/fiat/hybrid)")
|
117
117
|
status: ProviderStatus = Field(default=ProviderStatus.ACTIVE, description="Provider status")
|
118
118
|
priority: int = Field(default=100, ge=0, le=1000, description="Provider priority (lower = higher priority)")
|
119
|
-
|
119
|
+
|
120
120
|
# Feature flags
|
121
121
|
supports_fiat: bool = Field(default=False, description="Supports fiat currencies")
|
122
122
|
supports_crypto: bool = Field(default=True, description="Supports cryptocurrencies")
|
123
123
|
supports_webhooks: bool = Field(default=True, description="Supports webhook notifications")
|
124
124
|
supports_refunds: bool = Field(default=False, description="Supports payment refunds")
|
125
125
|
supports_partial_payments: bool = Field(default=False, description="Supports partial payments")
|
126
|
-
|
126
|
+
|
127
127
|
# Limits and fees
|
128
128
|
min_amount_usd: float = Field(default=1.0, ge=0.01, description="Minimum payment amount in USD")
|
129
129
|
max_amount_usd: float = Field(default=50000.0, ge=1.0, description="Maximum payment amount in USD")
|
130
130
|
fee_percentage: float = Field(default=0.0, ge=0.0, le=100.0, description="Fee percentage")
|
131
131
|
fixed_fee_usd: float = Field(default=0.0, ge=0.0, description="Fixed fee in USD")
|
132
|
-
|
132
|
+
|
133
133
|
# Geographic and regulatory
|
134
134
|
supported_countries: List[str] = Field(default_factory=list, description="Supported country codes")
|
135
135
|
restricted_countries: List[str] = Field(default_factory=list, description="Restricted country codes")
|
136
136
|
requires_kyc: bool = Field(default=False, description="Requires KYC verification")
|
137
|
-
|
137
|
+
|
138
138
|
# Technical details
|
139
139
|
api_version: str = Field(default="v1", description="API version")
|
140
140
|
documentation_url: Optional[str] = Field(None, description="API documentation URL")
|
141
141
|
status_page_url: Optional[str] = Field(None, description="Provider status page URL")
|
142
|
-
|
142
|
+
|
143
143
|
# Additional metadata
|
144
144
|
tags: List[str] = Field(default_factory=list, description="Provider tags for categorization")
|
145
145
|
description: Optional[str] = Field(None, max_length=500, description="Provider description")
|
@@ -5,25 +5,26 @@ Provider definitions with comprehensive metadata.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from enum import Enum
|
8
|
-
from typing import
|
9
|
-
|
8
|
+
from typing import Dict, List
|
9
|
+
|
10
|
+
from .base import ProviderMetadata, ProviderStatus, ProviderType
|
10
11
|
|
11
12
|
|
12
13
|
class ProviderEnum(Enum):
|
13
14
|
"""Enumeration of supported payment providers."""
|
14
|
-
|
15
|
+
|
15
16
|
NOWPAYMENTS = "nowpayments"
|
16
17
|
|
17
18
|
@classmethod
|
18
19
|
def get_all_providers(cls) -> List[str]:
|
19
20
|
"""Get list of all provider values."""
|
20
21
|
return [provider.value for provider in cls]
|
21
|
-
|
22
|
+
|
22
23
|
@classmethod
|
23
24
|
def is_valid_provider(cls, provider_name: str) -> bool:
|
24
25
|
"""Check if provider name is valid."""
|
25
26
|
return provider_name in cls.get_all_providers()
|
26
|
-
|
27
|
+
|
27
28
|
@classmethod
|
28
29
|
def get_crypto_providers(cls) -> List[str]:
|
29
30
|
"""Get list of crypto-supporting providers."""
|
@@ -31,7 +32,7 @@ class ProviderEnum(Enum):
|
|
31
32
|
provider.value for provider in cls
|
32
33
|
if PROVIDER_METADATA[provider.value].supports_crypto
|
33
34
|
]
|
34
|
-
|
35
|
+
|
35
36
|
@classmethod
|
36
37
|
def get_fiat_providers(cls) -> List[str]:
|
37
38
|
"""Get list of fiat-supporting providers."""
|
@@ -39,7 +40,7 @@ class ProviderEnum(Enum):
|
|
39
40
|
provider.value for provider in cls
|
40
41
|
if PROVIDER_METADATA[provider.value].supports_fiat
|
41
42
|
]
|
42
|
-
|
43
|
+
|
43
44
|
@classmethod
|
44
45
|
def get_active_providers(cls) -> List[str]:
|
45
46
|
"""Get list of active providers."""
|
@@ -56,30 +57,30 @@ PROVIDER_METADATA: Dict[str, ProviderMetadata] = {
|
|
56
57
|
provider_type=ProviderType.CRYPTO,
|
57
58
|
status=ProviderStatus.ACTIVE,
|
58
59
|
priority=10, # High priority
|
59
|
-
|
60
|
+
|
60
61
|
# Features
|
61
62
|
supports_fiat=False,
|
62
63
|
supports_crypto=True,
|
63
64
|
supports_webhooks=True,
|
64
65
|
supports_refunds=False,
|
65
66
|
supports_partial_payments=False,
|
66
|
-
|
67
|
+
|
67
68
|
# Limits and fees
|
68
69
|
min_amount_usd=1.0,
|
69
70
|
max_amount_usd=50000.0,
|
70
71
|
fee_percentage=0.5, # 0.5% fee
|
71
72
|
fixed_fee_usd=0.0,
|
72
|
-
|
73
|
+
|
73
74
|
# Geographic
|
74
75
|
supported_countries=[], # Global support
|
75
76
|
restricted_countries=["US"], # Example restriction
|
76
77
|
requires_kyc=False,
|
77
|
-
|
78
|
+
|
78
79
|
# Technical
|
79
80
|
api_version="v1",
|
80
81
|
documentation_url="https://documenter.getpostman.com/view/7907941/S1a32n38",
|
81
82
|
status_page_url="https://status.nowpayments.io/",
|
82
|
-
|
83
|
+
|
83
84
|
# Additional
|
84
85
|
tags=["crypto", "bitcoin", "ethereum", "altcoins", "instant"],
|
85
86
|
description="Cryptocurrency payment processor supporting 300+ cryptocurrencies with instant settlements"
|
@@ -4,14 +4,15 @@ Universal models for cross-provider compatibility.
|
|
4
4
|
These models provide a standardized interface across different payment providers.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from
|
8
|
-
|
7
|
+
from typing import List, Optional
|
8
|
+
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field
|
9
10
|
|
10
11
|
|
11
12
|
class UniversalCurrency(BaseModel):
|
12
13
|
"""Universal currency representation for cross-provider compatibility."""
|
13
14
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
14
|
-
|
15
|
+
|
15
16
|
provider_currency_code: str = Field(..., description="Provider-specific currency code")
|
16
17
|
base_currency_code: str = Field(..., description="Base currency code (e.g., BTC, USDT)")
|
17
18
|
network_code: Optional[str] = Field(None, description="Network code (e.g., eth, bsc, tron)")
|
@@ -31,14 +32,14 @@ class UniversalCurrency(BaseModel):
|
|
31
32
|
class UniversalCurrenciesResponse(BaseModel):
|
32
33
|
"""Response containing list of universal currencies."""
|
33
34
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
34
|
-
|
35
|
+
|
35
36
|
currencies: List[UniversalCurrency] = Field(default_factory=list, description="List of currencies")
|
36
37
|
|
37
38
|
|
38
39
|
class CurrencySyncResult(BaseModel):
|
39
40
|
"""Result of currency synchronization operation."""
|
40
41
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
41
|
-
|
42
|
+
|
42
43
|
currencies_created: int = Field(default=0, description="Number of currencies created")
|
43
44
|
currencies_updated: int = Field(default=0, description="Number of currencies updated")
|
44
45
|
networks_created: int = Field(default=0, description="Number of networks created")
|