django-cfg 1.4.20__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/migrations/0003_alter_documentarchive_archive_type.py +29 -0
- 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 +35 -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 +36 -35
- 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 +12 -13
- 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.20.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.20.dist-info/RECORD +0 -1110
- /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.20.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -4,29 +4,30 @@ Universal provider synchronization service.
|
|
4
4
|
Handles synchronization of currencies from all payment providers to database.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import List, Dict, Optional
|
8
|
-
from django.db import transaction
|
9
|
-
from django.utils import timezone
|
10
7
|
from datetime import timedelta
|
8
|
+
from typing import Dict, List, Optional
|
9
|
+
|
10
|
+
from django.utils import timezone
|
11
11
|
|
12
|
-
from django_cfg.modules.django_logging import get_logger
|
13
12
|
from django_cfg.apps.payments.models import ProviderCurrency
|
13
|
+
from django_cfg.modules.django_logging import get_logger
|
14
|
+
|
15
|
+
from .base import BaseProvider
|
14
16
|
from .models import CurrencySyncResult
|
15
17
|
from .registry import get_provider_registry
|
16
|
-
from .base import BaseProvider
|
17
18
|
|
18
19
|
logger = get_logger("provider_sync")
|
19
20
|
|
20
21
|
|
21
22
|
class ProviderSyncService:
|
22
23
|
"""Universal service for synchronizing all payment providers."""
|
23
|
-
|
24
|
+
|
24
25
|
def __init__(self):
|
25
26
|
"""Initialize provider sync service."""
|
26
27
|
self.registry = get_provider_registry()
|
27
|
-
|
28
|
+
|
28
29
|
def sync_all_providers(
|
29
|
-
self,
|
30
|
+
self,
|
30
31
|
force_refresh: bool = False,
|
31
32
|
provider_names: Optional[List[str]] = None
|
32
33
|
) -> Dict[str, CurrencySyncResult]:
|
@@ -41,7 +42,7 @@ class ProviderSyncService:
|
|
41
42
|
Dict[str, CurrencySyncResult]: Results by provider name
|
42
43
|
"""
|
43
44
|
logger.info("Starting universal provider synchronization")
|
44
|
-
|
45
|
+
|
45
46
|
# Get providers to sync
|
46
47
|
if provider_names:
|
47
48
|
providers_to_sync = []
|
@@ -54,50 +55,50 @@ class ProviderSyncService:
|
|
54
55
|
else:
|
55
56
|
available_providers = self.registry.get_available_providers()
|
56
57
|
providers_to_sync = [
|
57
|
-
(name, self.registry.get_provider(name))
|
58
|
+
(name, self.registry.get_provider(name))
|
58
59
|
for name in available_providers
|
59
60
|
]
|
60
|
-
|
61
|
+
|
61
62
|
if not providers_to_sync:
|
62
63
|
logger.warning("No providers available for synchronization")
|
63
64
|
return {}
|
64
|
-
|
65
|
+
|
65
66
|
# Sync each provider
|
66
67
|
results = {}
|
67
68
|
total_currencies = 0
|
68
69
|
total_errors = 0
|
69
|
-
|
70
|
+
|
70
71
|
for provider_name, provider in providers_to_sync:
|
71
72
|
try:
|
72
73
|
logger.info(f"Syncing provider: {provider_name}")
|
73
|
-
|
74
|
+
|
74
75
|
# Check if sync is needed
|
75
76
|
if not force_refresh and self._is_recently_synced(provider_name):
|
76
77
|
logger.info(f"Provider {provider_name} recently synced, skipping")
|
77
78
|
results[provider_name] = CurrencySyncResult(
|
78
79
|
total_processed=0,
|
79
|
-
errors=[
|
80
|
+
errors=["Skipped - recently synced (use --force-refresh to override)"]
|
80
81
|
)
|
81
82
|
continue
|
82
|
-
|
83
|
+
|
83
84
|
# Perform sync
|
84
85
|
sync_result = self._sync_single_provider(provider)
|
85
86
|
results[provider_name] = sync_result
|
86
|
-
|
87
|
+
|
87
88
|
# Update stats
|
88
89
|
total_currencies += sync_result.currencies_created + sync_result.currencies_updated
|
89
90
|
total_errors += len(sync_result.errors)
|
90
|
-
|
91
|
+
|
91
92
|
# Mark sync time
|
92
93
|
self._mark_sync_time(provider_name)
|
93
|
-
|
94
|
+
|
94
95
|
logger.info(
|
95
96
|
f"Provider {provider_name} sync completed: "
|
96
97
|
f"{sync_result.currencies_created} created, "
|
97
98
|
f"{sync_result.currencies_updated} updated, "
|
98
99
|
f"{len(sync_result.errors)} errors"
|
99
100
|
)
|
100
|
-
|
101
|
+
|
101
102
|
except Exception as e:
|
102
103
|
error_msg = f"Provider {provider_name} sync failed: {e}"
|
103
104
|
logger.error(error_msg)
|
@@ -106,19 +107,19 @@ class ProviderSyncService:
|
|
106
107
|
errors=[error_msg]
|
107
108
|
)
|
108
109
|
total_errors += 1
|
109
|
-
|
110
|
+
|
110
111
|
logger.info(
|
111
112
|
f"Universal provider sync completed: "
|
112
113
|
f"{len(results)} providers processed, "
|
113
114
|
f"{total_currencies} currencies synced, "
|
114
115
|
f"{total_errors} errors"
|
115
116
|
)
|
116
|
-
|
117
|
+
|
117
118
|
return results
|
118
|
-
|
119
|
+
|
119
120
|
def sync_provider(
|
120
|
-
self,
|
121
|
-
provider_name: str,
|
121
|
+
self,
|
122
|
+
provider_name: str,
|
122
123
|
force_refresh: bool = False
|
123
124
|
) -> CurrencySyncResult:
|
124
125
|
"""
|
@@ -137,22 +138,22 @@ class ProviderSyncService:
|
|
137
138
|
total_processed=0,
|
138
139
|
errors=[f"Provider {provider_name} not available"]
|
139
140
|
)
|
140
|
-
|
141
|
+
|
141
142
|
# Check if sync is needed
|
142
143
|
if not force_refresh and self._is_recently_synced(provider_name):
|
143
144
|
return CurrencySyncResult(
|
144
145
|
total_processed=0,
|
145
146
|
errors=[f"Provider {provider_name} recently synced (use force_refresh=True to override)"]
|
146
147
|
)
|
147
|
-
|
148
|
+
|
148
149
|
# Perform sync
|
149
150
|
result = self._sync_single_provider(provider)
|
150
|
-
|
151
|
+
|
151
152
|
# Mark sync time
|
152
153
|
self._mark_sync_time(provider_name)
|
153
|
-
|
154
|
+
|
154
155
|
return result
|
155
|
-
|
156
|
+
|
156
157
|
def get_sync_statistics(self) -> Dict[str, any]:
|
157
158
|
"""
|
158
159
|
Get synchronization statistics for all providers.
|
@@ -161,30 +162,30 @@ class ProviderSyncService:
|
|
161
162
|
Dict: Statistics by provider
|
162
163
|
"""
|
163
164
|
stats = {}
|
164
|
-
|
165
|
+
|
165
166
|
for provider_name in self.registry.list_providers():
|
166
167
|
provider_stats = self._get_provider_stats(provider_name)
|
167
168
|
stats[provider_name] = provider_stats
|
168
|
-
|
169
|
+
|
169
170
|
return stats
|
170
|
-
|
171
|
+
|
171
172
|
def _sync_single_provider(self, provider: BaseProvider) -> CurrencySyncResult:
|
172
173
|
"""Sync currencies from a single provider."""
|
173
174
|
try:
|
174
175
|
logger.debug(f"Starting sync for provider: {provider.name}")
|
175
|
-
|
176
|
+
|
176
177
|
# Use provider's sync method
|
177
178
|
result = provider.sync_currencies_to_db()
|
178
|
-
|
179
|
+
|
179
180
|
logger.debug(
|
180
181
|
f"Provider {provider.name} sync result: "
|
181
182
|
f"{result.currencies_created} created, "
|
182
183
|
f"{result.currencies_updated} updated, "
|
183
184
|
f"{result.provider_currencies_created} provider currencies created"
|
184
185
|
)
|
185
|
-
|
186
|
+
|
186
187
|
return result
|
187
|
-
|
188
|
+
|
188
189
|
except Exception as e:
|
189
190
|
error_msg = f"Sync failed for provider {provider.name}: {e}"
|
190
191
|
logger.error(error_msg)
|
@@ -192,52 +193,51 @@ class ProviderSyncService:
|
|
192
193
|
total_processed=0,
|
193
194
|
errors=[error_msg]
|
194
195
|
)
|
195
|
-
|
196
|
+
|
196
197
|
def _is_recently_synced(self, provider_name: str, hours: int = 1) -> bool:
|
197
198
|
"""Check if provider was recently synced."""
|
198
199
|
try:
|
199
200
|
# Check if any provider currencies were updated recently
|
200
201
|
recent_threshold = timezone.now() - timedelta(hours=hours)
|
201
|
-
|
202
|
+
|
202
203
|
recent_updates = ProviderCurrency.objects.filter(
|
203
204
|
provider=provider_name,
|
204
205
|
updated_at__gte=recent_threshold
|
205
206
|
).exists()
|
206
|
-
|
207
|
+
|
207
208
|
return recent_updates
|
208
|
-
|
209
|
+
|
209
210
|
except Exception as e:
|
210
211
|
logger.warning(f"Failed to check sync status for {provider_name}: {e}")
|
211
212
|
return False
|
212
|
-
|
213
|
+
|
213
214
|
def _mark_sync_time(self, provider_name: str):
|
214
215
|
"""Mark sync time for provider (could be stored in cache/database)."""
|
215
216
|
# For now, we rely on ProviderCurrency.updated_at
|
216
217
|
# In future, could store in dedicated sync log table
|
217
218
|
pass
|
218
|
-
|
219
|
+
|
219
220
|
def _get_provider_stats(self, provider_name: str) -> Dict[str, any]:
|
220
221
|
"""Get statistics for a specific provider."""
|
221
222
|
try:
|
222
|
-
|
223
|
-
|
223
|
+
|
224
224
|
# Get provider currency stats
|
225
225
|
provider_currencies = ProviderCurrency.objects.filter(provider=provider_name)
|
226
|
-
|
226
|
+
|
227
227
|
total_currencies = provider_currencies.count()
|
228
228
|
enabled_currencies = provider_currencies.filter(is_enabled=True).count()
|
229
|
-
|
229
|
+
|
230
230
|
# Get recent activity
|
231
231
|
recent_threshold = timezone.now() - timedelta(hours=24)
|
232
232
|
recent_updates = provider_currencies.filter(
|
233
233
|
updated_at__gte=recent_threshold
|
234
234
|
).count()
|
235
|
-
|
235
|
+
|
236
236
|
# Get last sync time
|
237
237
|
last_sync = None
|
238
238
|
if provider_currencies.exists():
|
239
239
|
last_sync = provider_currencies.order_by('-updated_at').first().updated_at
|
240
|
-
|
240
|
+
|
241
241
|
return {
|
242
242
|
'total_currencies': total_currencies,
|
243
243
|
'enabled_currencies': enabled_currencies,
|
@@ -246,7 +246,7 @@ class ProviderSyncService:
|
|
246
246
|
'last_sync': last_sync.isoformat() if last_sync else None,
|
247
247
|
'is_recently_synced': self._is_recently_synced(provider_name)
|
248
248
|
}
|
249
|
-
|
249
|
+
|
250
250
|
except Exception as e:
|
251
251
|
logger.error(f"Failed to get stats for {provider_name}: {e}")
|
252
252
|
return {
|
@@ -6,40 +6,39 @@ Uses Pydantic 2 for service layer validation and business logic.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
# Request types
|
9
|
+
# Data types
|
10
|
+
from .data import (
|
11
|
+
BalanceData,
|
12
|
+
CurrencyData,
|
13
|
+
PaymentData,
|
14
|
+
ProviderData,
|
15
|
+
SubscriptionData,
|
16
|
+
TransactionData,
|
17
|
+
)
|
9
18
|
from .requests import (
|
19
|
+
BalanceUpdateRequest,
|
20
|
+
CurrencyConversionRequest,
|
10
21
|
PaymentCreateRequest,
|
11
22
|
PaymentStatusRequest,
|
12
|
-
BalanceUpdateRequest,
|
13
23
|
SubscriptionCreateRequest,
|
14
24
|
SubscriptionUpdateRequest,
|
15
|
-
CurrencyConversionRequest,
|
16
25
|
WebhookValidationRequest,
|
17
26
|
)
|
18
27
|
|
19
|
-
# Response types
|
28
|
+
# Response types
|
20
29
|
from .responses import (
|
21
|
-
PaymentResult,
|
22
|
-
ProviderResponse,
|
23
30
|
BalanceResult,
|
24
|
-
SubscriptionResult,
|
25
31
|
CurrencyConversionResult,
|
32
|
+
PaymentResult,
|
33
|
+
ProviderResponse,
|
26
34
|
ServiceOperationResult,
|
27
|
-
|
28
|
-
|
29
|
-
# Data types
|
30
|
-
from .data import (
|
31
|
-
PaymentData,
|
32
|
-
BalanceData,
|
33
|
-
SubscriptionData,
|
34
|
-
TransactionData,
|
35
|
-
CurrencyData,
|
36
|
-
ProviderData,
|
35
|
+
SubscriptionResult,
|
37
36
|
)
|
38
37
|
|
39
38
|
# Webhook types
|
40
39
|
from .webhooks import (
|
41
|
-
WebhookData,
|
42
40
|
NowPaymentsWebhook,
|
41
|
+
WebhookData,
|
43
42
|
WebhookProcessingResult,
|
44
43
|
WebhookSignature,
|
45
44
|
)
|
@@ -47,21 +46,21 @@ from .webhooks import (
|
|
47
46
|
__all__ = [
|
48
47
|
# Request types
|
49
48
|
'PaymentCreateRequest',
|
50
|
-
'PaymentStatusRequest',
|
49
|
+
'PaymentStatusRequest',
|
51
50
|
'BalanceUpdateRequest',
|
52
51
|
'SubscriptionCreateRequest',
|
53
52
|
'SubscriptionUpdateRequest',
|
54
53
|
'CurrencyConversionRequest',
|
55
54
|
'WebhookValidationRequest',
|
56
|
-
|
55
|
+
|
57
56
|
# Response types
|
58
57
|
'PaymentResult',
|
59
58
|
'ProviderResponse',
|
60
59
|
'BalanceResult',
|
61
|
-
'SubscriptionResult',
|
60
|
+
'SubscriptionResult',
|
62
61
|
'CurrencyConversionResult',
|
63
62
|
'ServiceOperationResult',
|
64
|
-
|
63
|
+
|
65
64
|
# Data types
|
66
65
|
'PaymentData',
|
67
66
|
'BalanceData',
|
@@ -69,7 +68,7 @@ __all__ = [
|
|
69
68
|
'TransactionData',
|
70
69
|
'CurrencyData',
|
71
70
|
'ProviderData',
|
72
|
-
|
71
|
+
|
73
72
|
# Webhook types
|
74
73
|
'WebhookData',
|
75
74
|
'NowPaymentsWebhook',
|
@@ -4,16 +4,17 @@ Data types for the Universal Payment System v2.0.
|
|
4
4
|
Pydantic models for internal data representation and transfer.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from decimal import Decimal
|
8
|
-
from typing import Optional, Dict, Any, List, Literal
|
9
|
-
from pydantic import BaseModel, Field, ConfigDict
|
10
7
|
from datetime import datetime
|
8
|
+
from decimal import Decimal
|
9
|
+
from typing import Any, Dict, List, Optional
|
10
|
+
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field
|
11
12
|
|
12
13
|
|
13
14
|
class PaymentData(BaseModel):
|
14
15
|
"""Internal payment data representation."""
|
15
16
|
model_config = ConfigDict(validate_assignment=True, from_attributes=True)
|
16
|
-
|
17
|
+
|
17
18
|
id: str = Field(description="Payment ID")
|
18
19
|
user_id: int = Field(description="User ID")
|
19
20
|
amount_usd: float = Field(description="Amount in USD")
|
@@ -38,7 +39,7 @@ class PaymentData(BaseModel):
|
|
38
39
|
class BalanceData(BaseModel):
|
39
40
|
"""Internal balance data representation."""
|
40
41
|
model_config = ConfigDict(validate_assignment=True, from_attributes=True)
|
41
|
-
|
42
|
+
|
42
43
|
user_id: int = Field(description="User ID")
|
43
44
|
balance_usd: float = Field(description="Balance in USD")
|
44
45
|
created_at: datetime = Field(description="Creation timestamp")
|
@@ -48,7 +49,7 @@ class BalanceData(BaseModel):
|
|
48
49
|
class TransactionData(BaseModel):
|
49
50
|
"""Internal transaction data representation."""
|
50
51
|
model_config = ConfigDict(validate_assignment=True, from_attributes=True)
|
51
|
-
|
52
|
+
|
52
53
|
id: str = Field(description="Transaction ID")
|
53
54
|
user_id: int = Field(description="User ID")
|
54
55
|
amount: float = Field(description="Transaction amount")
|
@@ -62,7 +63,7 @@ class TransactionData(BaseModel):
|
|
62
63
|
class SubscriptionData(BaseModel):
|
63
64
|
"""Internal subscription data representation."""
|
64
65
|
model_config = ConfigDict(validate_assignment=True, from_attributes=True)
|
65
|
-
|
66
|
+
|
66
67
|
id: str = Field(description="Subscription ID")
|
67
68
|
user_id: int = Field(description="User ID")
|
68
69
|
tier: str = Field(description="Subscription tier")
|
@@ -82,7 +83,7 @@ class SubscriptionData(BaseModel):
|
|
82
83
|
class CurrencyData(BaseModel):
|
83
84
|
"""Internal currency data representation."""
|
84
85
|
model_config = ConfigDict(validate_assignment=True, from_attributes=True)
|
85
|
-
|
86
|
+
|
86
87
|
code: str = Field(description="Currency code")
|
87
88
|
name: str = Field(description="Currency name")
|
88
89
|
currency_type: str = Field(description="Currency type (fiat/crypto)")
|
@@ -99,7 +100,7 @@ class CurrencyData(BaseModel):
|
|
99
100
|
class ProviderData(BaseModel):
|
100
101
|
"""Internal provider data representation."""
|
101
102
|
model_config = ConfigDict(validate_assignment=True)
|
102
|
-
|
103
|
+
|
103
104
|
name: str = Field(description="Provider name")
|
104
105
|
display_name: str = Field(description="Provider display name")
|
105
106
|
is_enabled: bool = Field(default=True, description="Provider enabled status")
|
@@ -118,7 +119,7 @@ class ProviderData(BaseModel):
|
|
118
119
|
class APIKeyData(BaseModel):
|
119
120
|
"""Internal API key data representation."""
|
120
121
|
model_config = ConfigDict(validate_assignment=True, from_attributes=True)
|
121
|
-
|
122
|
+
|
122
123
|
id: str = Field(description="API key ID")
|
123
124
|
user_id: int = Field(description="User ID")
|
124
125
|
name: str = Field(description="API key name")
|
@@ -135,7 +136,7 @@ class APIKeyData(BaseModel):
|
|
135
136
|
class NetworkData(BaseModel):
|
136
137
|
"""Internal network data representation."""
|
137
138
|
model_config = ConfigDict(validate_assignment=True, from_attributes=True)
|
138
|
-
|
139
|
+
|
139
140
|
code: str = Field(description="Network code")
|
140
141
|
name: str = Field(description="Network name")
|
141
142
|
currency_code: str = Field(description="Base currency code")
|
@@ -148,7 +149,7 @@ class NetworkData(BaseModel):
|
|
148
149
|
class TariffData(BaseModel):
|
149
150
|
"""Internal tariff data representation."""
|
150
151
|
model_config = ConfigDict(validate_assignment=True, from_attributes=True)
|
151
|
-
|
152
|
+
|
152
153
|
id: str = Field(description="Tariff ID")
|
153
154
|
name: str = Field(description="Tariff name")
|
154
155
|
tier: str = Field(description="Subscription tier")
|
@@ -166,7 +167,7 @@ class TariffData(BaseModel):
|
|
166
167
|
class EndpointGroupData(BaseModel):
|
167
168
|
"""Internal endpoint group data representation."""
|
168
169
|
model_config = ConfigDict(validate_assignment=True, from_attributes=True)
|
169
|
-
|
170
|
+
|
170
171
|
code: str = Field(description="Endpoint group code")
|
171
172
|
name: str = Field(description="Endpoint group name")
|
172
173
|
description: Optional[str] = Field(None, description="Group description")
|
@@ -4,10 +4,9 @@ Request types for the Universal Payment System v2.0.
|
|
4
4
|
Pydantic models for validating incoming service requests.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from
|
8
|
-
|
9
|
-
from pydantic import BaseModel,
|
10
|
-
from datetime import datetime
|
7
|
+
from typing import Any, Dict, Literal, Optional
|
8
|
+
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
11
10
|
|
12
11
|
|
13
12
|
class PaymentCreateRequest(BaseModel):
|
@@ -21,7 +20,7 @@ class PaymentCreateRequest(BaseModel):
|
|
21
20
|
extra="forbid",
|
22
21
|
str_strip_whitespace=True
|
23
22
|
)
|
24
|
-
|
23
|
+
|
25
24
|
user_id: int = Field(gt=0, description="User ID")
|
26
25
|
amount_usd: float = Field(gt=1.0, le=50000.0, description="Amount in USD")
|
27
26
|
currency_code: str = Field(
|
@@ -29,18 +28,18 @@ class PaymentCreateRequest(BaseModel):
|
|
29
28
|
)
|
30
29
|
provider: Literal['nowpayments'] = Field(default='nowpayments', description="Payment provider")
|
31
30
|
callback_url: Optional[str] = Field(None, description="Success callback URL")
|
32
|
-
cancel_url: Optional[str] = Field(None, description="Cancellation URL")
|
31
|
+
cancel_url: Optional[str] = Field(None, description="Cancellation URL")
|
33
32
|
description: Optional[str] = Field(None, max_length=500, description="Payment description")
|
34
33
|
metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
|
35
|
-
|
34
|
+
|
36
35
|
@field_validator('currency_code')
|
37
36
|
@classmethod
|
38
37
|
def validate_currency(cls, v: str) -> str:
|
39
38
|
"""Validate currency is supported by checking database."""
|
40
39
|
from django_cfg.apps.payments.models import Currency
|
41
|
-
|
40
|
+
|
42
41
|
currency_code = v.upper().strip()
|
43
|
-
|
42
|
+
|
44
43
|
# Check if currency exists in database and is active
|
45
44
|
try:
|
46
45
|
currency = Currency.objects.get(code=currency_code, is_active=True)
|
@@ -53,7 +52,7 @@ class PaymentCreateRequest(BaseModel):
|
|
53
52
|
except Exception:
|
54
53
|
# Fallback validation if database is not available
|
55
54
|
return currency_code
|
56
|
-
|
55
|
+
|
57
56
|
@field_validator('callback_url', 'cancel_url')
|
58
57
|
@classmethod
|
59
58
|
def validate_urls(cls, v: Optional[str]) -> Optional[str]:
|
@@ -66,7 +65,7 @@ class PaymentCreateRequest(BaseModel):
|
|
66
65
|
class PaymentStatusRequest(BaseModel):
|
67
66
|
"""Request for checking payment status."""
|
68
67
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
69
|
-
|
68
|
+
|
70
69
|
payment_id: str = Field(description="Payment ID to check")
|
71
70
|
user_id: Optional[int] = Field(None, description="User ID for authorization")
|
72
71
|
force_provider_check: bool = Field(default=False, description="Force check with provider")
|
@@ -75,7 +74,7 @@ class PaymentStatusRequest(BaseModel):
|
|
75
74
|
class BalanceUpdateRequest(BaseModel):
|
76
75
|
"""Request for updating user balance."""
|
77
76
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
78
|
-
|
77
|
+
|
79
78
|
user_id: int = Field(gt=0, description="User ID")
|
80
79
|
amount: float = Field(description="Amount to add/subtract (positive=add, negative=subtract)")
|
81
80
|
transaction_type: Literal['deposit', 'withdrawal', 'payment', 'refund', 'fee', 'bonus', 'adjustment'] = Field(
|
@@ -84,7 +83,7 @@ class BalanceUpdateRequest(BaseModel):
|
|
84
83
|
description: Optional[str] = Field(None, description="Transaction description")
|
85
84
|
payment_id: Optional[str] = Field(None, description="Related payment ID")
|
86
85
|
metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
|
87
|
-
|
86
|
+
|
88
87
|
@field_validator('amount')
|
89
88
|
@classmethod
|
90
89
|
def validate_amount(cls, v: float) -> float:
|
@@ -97,7 +96,7 @@ class BalanceUpdateRequest(BaseModel):
|
|
97
96
|
class SubscriptionCreateRequest(BaseModel):
|
98
97
|
"""Request for creating subscription."""
|
99
98
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
100
|
-
|
99
|
+
|
101
100
|
user_id: int = Field(gt=0, description="User ID")
|
102
101
|
tier: Literal['free', 'basic', 'pro', 'enterprise'] = Field(description="Subscription tier")
|
103
102
|
duration_days: int = Field(default=30, gt=0, le=365, description="Subscription duration in days")
|
@@ -108,7 +107,7 @@ class SubscriptionCreateRequest(BaseModel):
|
|
108
107
|
class SubscriptionUpdateRequest(BaseModel):
|
109
108
|
"""Request for updating subscription."""
|
110
109
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
111
|
-
|
110
|
+
|
112
111
|
subscription_id: int = Field(gt=0, description="Subscription ID")
|
113
112
|
tier: Optional[Literal['free', 'basic', 'pro', 'enterprise']] = Field(None, description="New subscription tier")
|
114
113
|
duration_days: Optional[int] = Field(None, gt=0, le=365, description="New duration in days")
|
@@ -119,11 +118,11 @@ class SubscriptionUpdateRequest(BaseModel):
|
|
119
118
|
class CurrencyConversionRequest(BaseModel):
|
120
119
|
"""Request for currency conversion."""
|
121
120
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
122
|
-
|
121
|
+
|
123
122
|
amount: float = Field(gt=0, description="Amount to convert")
|
124
123
|
from_currency: str = Field(min_length=3, max_length=10, description="Source currency code")
|
125
124
|
to_currency: str = Field(min_length=3, max_length=10, description="Target currency code")
|
126
|
-
|
125
|
+
|
127
126
|
@field_validator('from_currency', 'to_currency')
|
128
127
|
@classmethod
|
129
128
|
def validate_currency_codes(cls, v: str) -> str:
|
@@ -134,7 +133,7 @@ class CurrencyConversionRequest(BaseModel):
|
|
134
133
|
class APIKeyCreateRequest(BaseModel):
|
135
134
|
"""Request for creating API key."""
|
136
135
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
137
|
-
|
136
|
+
|
138
137
|
user_id: int = Field(gt=0, description="User ID")
|
139
138
|
name: str = Field(min_length=1, max_length=100, description="API key name")
|
140
139
|
expires_in_days: Optional[int] = Field(None, gt=0, le=365, description="Days until expiration")
|
@@ -144,19 +143,19 @@ class APIKeyCreateRequest(BaseModel):
|
|
144
143
|
class WebhookValidationRequest(BaseModel):
|
145
144
|
"""Request for webhook validation."""
|
146
145
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
147
|
-
|
146
|
+
|
148
147
|
provider: str = Field(description="Provider name")
|
149
148
|
payload: Dict[str, Any] = Field(description="Webhook payload")
|
150
149
|
signature: Optional[str] = Field(None, description="Webhook signature")
|
151
150
|
headers: Dict[str, str] = Field(default_factory=dict, description="Request headers")
|
152
151
|
timestamp: Optional[str] = Field(None, description="Request timestamp")
|
153
152
|
request_id: Optional[str] = Field(None, description="Request ID for tracking")
|
154
|
-
|
155
|
-
|
153
|
+
|
154
|
+
|
156
155
|
class ProviderHealthCheckRequest(BaseModel):
|
157
156
|
"""Request for provider health check."""
|
158
157
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
159
|
-
|
158
|
+
|
160
159
|
provider: str = Field(description="Provider name to check")
|
161
160
|
include_rates: bool = Field(default=False, description="Include currency rates in check")
|
162
161
|
timeout: int = Field(default=30, gt=0, le=300, description="Timeout in seconds")
|