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,19 +4,23 @@ Balance service for the Universal Payment System v2.0.
|
|
4
4
|
Handles user balance operations and transaction management.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import Optional
|
7
|
+
from typing import Optional
|
8
|
+
|
8
9
|
from django.contrib.auth import get_user_model
|
9
10
|
from django.db import models
|
10
11
|
from django.utils import timezone
|
11
12
|
|
12
13
|
User = get_user_model()
|
13
14
|
|
14
|
-
from
|
15
|
+
from ...models import Transaction, UserBalance
|
15
16
|
from ..types import (
|
16
|
-
|
17
|
-
|
17
|
+
BalanceData,
|
18
|
+
BalanceResult,
|
19
|
+
BalanceUpdateRequest,
|
20
|
+
ServiceOperationResult,
|
21
|
+
TransactionData,
|
18
22
|
)
|
19
|
-
from
|
23
|
+
from .base import BaseService
|
20
24
|
|
21
25
|
|
22
26
|
class BalanceService(BaseService):
|
@@ -25,7 +29,7 @@ class BalanceService(BaseService):
|
|
25
29
|
|
26
30
|
Handles balance operations using Pydantic validation and Django ORM managers.
|
27
31
|
"""
|
28
|
-
|
32
|
+
|
29
33
|
def get_user_balance(self, user_id: int) -> BalanceResult:
|
30
34
|
"""
|
31
35
|
Get user balance, creating if doesn't exist.
|
@@ -38,7 +42,7 @@ class BalanceService(BaseService):
|
|
38
42
|
"""
|
39
43
|
try:
|
40
44
|
self.logger.debug("Getting user balance", extra={'user_id': user_id})
|
41
|
-
|
45
|
+
|
42
46
|
# Get or create user
|
43
47
|
try:
|
44
48
|
user = User.objects.get(id=user_id)
|
@@ -48,18 +52,18 @@ class BalanceService(BaseService):
|
|
48
52
|
message=f"User {user_id} not found",
|
49
53
|
error_code="user_not_found"
|
50
54
|
)
|
51
|
-
|
55
|
+
|
52
56
|
# Get or create balance using manager
|
53
57
|
balance = UserBalance.objects.get_or_create_for_user(user)
|
54
58
|
balance_data = BalanceData.model_validate(balance)
|
55
|
-
|
59
|
+
|
56
60
|
self._log_operation(
|
57
61
|
"get_user_balance",
|
58
62
|
True,
|
59
63
|
user_id=user_id,
|
60
64
|
balance_usd=balance.balance_usd
|
61
65
|
)
|
62
|
-
|
66
|
+
|
63
67
|
return BalanceResult(
|
64
68
|
success=True,
|
65
69
|
message="Balance retrieved successfully",
|
@@ -67,13 +71,13 @@ class BalanceService(BaseService):
|
|
67
71
|
balance_usd=balance.balance_usd,
|
68
72
|
data={'balance': balance_data.model_dump()}
|
69
73
|
)
|
70
|
-
|
74
|
+
|
71
75
|
except Exception as e:
|
72
76
|
return BalanceResult(**self._handle_exception(
|
73
77
|
"get_user_balance", e,
|
74
78
|
user_id=user_id
|
75
79
|
).model_dump())
|
76
|
-
|
80
|
+
|
77
81
|
def update_balance(self, request: BalanceUpdateRequest) -> BalanceResult:
|
78
82
|
"""
|
79
83
|
Update user balance with transaction record.
|
@@ -88,13 +92,13 @@ class BalanceService(BaseService):
|
|
88
92
|
# Validate request
|
89
93
|
if isinstance(request, dict):
|
90
94
|
request = BalanceUpdateRequest(**request)
|
91
|
-
|
95
|
+
|
92
96
|
self.logger.info("Updating user balance", extra={
|
93
97
|
'user_id': request.user_id,
|
94
98
|
'amount': request.amount,
|
95
99
|
'transaction_type': request.transaction_type
|
96
100
|
})
|
97
|
-
|
101
|
+
|
98
102
|
# Get user
|
99
103
|
try:
|
100
104
|
user = User.objects.get(id=request.user_id)
|
@@ -104,10 +108,10 @@ class BalanceService(BaseService):
|
|
104
108
|
message=f"User {request.user_id} not found",
|
105
109
|
error_code="user_not_found"
|
106
110
|
)
|
107
|
-
|
111
|
+
|
108
112
|
# Get or create balance
|
109
113
|
balance = UserBalance.objects.get_or_create_for_user(user)
|
110
|
-
|
114
|
+
|
111
115
|
# Check for sufficient funds if subtracting
|
112
116
|
if request.amount < 0 and balance.balance_usd + request.amount < 0:
|
113
117
|
return BalanceResult(
|
@@ -117,7 +121,7 @@ class BalanceService(BaseService):
|
|
117
121
|
user_id=request.user_id,
|
118
122
|
balance_usd=balance.balance_usd
|
119
123
|
)
|
120
|
-
|
124
|
+
|
121
125
|
# Update balance using manager
|
122
126
|
def update_balance_transaction():
|
123
127
|
if request.amount > 0:
|
@@ -135,12 +139,12 @@ class BalanceService(BaseService):
|
|
135
139
|
payment_id=request.payment_id
|
136
140
|
)
|
137
141
|
return transaction
|
138
|
-
|
142
|
+
|
139
143
|
transaction = self._execute_with_transaction(update_balance_transaction)
|
140
|
-
|
144
|
+
|
141
145
|
# Refresh balance
|
142
146
|
balance.refresh_from_db()
|
143
|
-
|
147
|
+
|
144
148
|
# Convert to response data
|
145
149
|
balance_data = BalanceData.model_validate(balance)
|
146
150
|
transaction_data = TransactionData(
|
@@ -153,7 +157,7 @@ class BalanceService(BaseService):
|
|
153
157
|
metadata=transaction.metadata or {},
|
154
158
|
created_at=transaction.created_at
|
155
159
|
)
|
156
|
-
|
160
|
+
|
157
161
|
self._log_operation(
|
158
162
|
"update_balance",
|
159
163
|
True,
|
@@ -162,7 +166,7 @@ class BalanceService(BaseService):
|
|
162
166
|
new_balance=balance.balance_usd,
|
163
167
|
transaction_id=str(transaction.id)
|
164
168
|
)
|
165
|
-
|
169
|
+
|
166
170
|
return BalanceResult(
|
167
171
|
success=True,
|
168
172
|
message="Balance updated successfully",
|
@@ -176,17 +180,17 @@ class BalanceService(BaseService):
|
|
176
180
|
'transaction': transaction_data.model_dump()
|
177
181
|
}
|
178
182
|
)
|
179
|
-
|
183
|
+
|
180
184
|
except Exception as e:
|
181
185
|
return BalanceResult(**self._handle_exception(
|
182
186
|
"update_balance", e,
|
183
187
|
user_id=request.user_id if hasattr(request, 'user_id') else None
|
184
188
|
).model_dump())
|
185
|
-
|
189
|
+
|
186
190
|
def add_funds(
|
187
|
-
self,
|
188
|
-
user_id: int,
|
189
|
-
amount: float,
|
191
|
+
self,
|
192
|
+
user_id: int,
|
193
|
+
amount: float,
|
190
194
|
description: str = None,
|
191
195
|
payment_id: str = None
|
192
196
|
) -> BalanceResult:
|
@@ -210,7 +214,7 @@ class BalanceService(BaseService):
|
|
210
214
|
payment_id=payment_id
|
211
215
|
)
|
212
216
|
return self.update_balance(request)
|
213
|
-
|
217
|
+
|
214
218
|
def subtract_funds(
|
215
219
|
self,
|
216
220
|
user_id: int,
|
@@ -238,7 +242,7 @@ class BalanceService(BaseService):
|
|
238
242
|
payment_id=payment_id
|
239
243
|
)
|
240
244
|
return self.update_balance(request)
|
241
|
-
|
245
|
+
|
242
246
|
def get_user_transactions(
|
243
247
|
self,
|
244
248
|
user_id: int,
|
@@ -265,32 +269,32 @@ class BalanceService(BaseService):
|
|
265
269
|
'limit': limit,
|
266
270
|
'offset': offset
|
267
271
|
})
|
268
|
-
|
272
|
+
|
269
273
|
# Check user exists
|
270
274
|
if not User.objects.filter(id=user_id).exists():
|
271
275
|
return self._create_error_result(
|
272
276
|
f"User {user_id} not found",
|
273
277
|
"user_not_found"
|
274
278
|
)
|
275
|
-
|
279
|
+
|
276
280
|
# Build query
|
277
281
|
queryset = Transaction.objects.filter(user_id=user_id)
|
278
|
-
|
282
|
+
|
279
283
|
if transaction_type:
|
280
284
|
queryset = queryset.filter(transaction_type=transaction_type)
|
281
|
-
|
285
|
+
|
282
286
|
# Get total count
|
283
287
|
total_count = queryset.count()
|
284
|
-
|
288
|
+
|
285
289
|
# Get transactions with pagination
|
286
290
|
transactions = queryset.order_by('-created_at')[offset:offset + limit]
|
287
|
-
|
291
|
+
|
288
292
|
# Convert to data
|
289
293
|
transaction_data = [
|
290
294
|
TransactionData.model_validate(transaction).model_dump()
|
291
295
|
for transaction in transactions
|
292
296
|
]
|
293
|
-
|
297
|
+
|
294
298
|
return self._create_success_result(
|
295
299
|
f"Retrieved {len(transaction_data)} transactions",
|
296
300
|
{
|
@@ -301,13 +305,13 @@ class BalanceService(BaseService):
|
|
301
305
|
'has_more': offset + limit < total_count
|
302
306
|
}
|
303
307
|
)
|
304
|
-
|
308
|
+
|
305
309
|
except Exception as e:
|
306
310
|
return self._handle_exception(
|
307
311
|
"get_user_transactions", e,
|
308
312
|
user_id=user_id
|
309
313
|
)
|
310
|
-
|
314
|
+
|
311
315
|
def get_balance_stats(self, days: int = 30) -> ServiceOperationResult:
|
312
316
|
"""
|
313
317
|
Get balance and transaction statistics.
|
@@ -320,9 +324,9 @@ class BalanceService(BaseService):
|
|
320
324
|
"""
|
321
325
|
try:
|
322
326
|
from datetime import timedelta
|
323
|
-
|
327
|
+
|
324
328
|
since = timezone.now() - timedelta(days=days)
|
325
|
-
|
329
|
+
|
326
330
|
# Balance stats
|
327
331
|
balance_stats = UserBalance.objects.aggregate(
|
328
332
|
total_users=models.Count('user_id'),
|
@@ -334,7 +338,7 @@ class BalanceService(BaseService):
|
|
334
338
|
filter=models.Q(balance_usd__gt=0)
|
335
339
|
)
|
336
340
|
)
|
337
|
-
|
341
|
+
|
338
342
|
# Transaction stats
|
339
343
|
transaction_stats = Transaction.objects.filter(
|
340
344
|
created_at__gte=since
|
@@ -351,7 +355,7 @@ class BalanceService(BaseService):
|
|
351
355
|
),
|
352
356
|
avg_transaction=models.Avg('amount_usd')
|
353
357
|
)
|
354
|
-
|
358
|
+
|
355
359
|
# Transaction type breakdown
|
356
360
|
type_breakdown = Transaction.objects.filter(
|
357
361
|
created_at__gte=since
|
@@ -359,7 +363,7 @@ class BalanceService(BaseService):
|
|
359
363
|
count=models.Count('id'),
|
360
364
|
volume=models.Sum('amount_usd')
|
361
365
|
).order_by('-count')
|
362
|
-
|
366
|
+
|
363
367
|
stats = {
|
364
368
|
'period_days': days,
|
365
369
|
'balance_stats': balance_stats,
|
@@ -367,15 +371,15 @@ class BalanceService(BaseService):
|
|
367
371
|
'transaction_types': list(type_breakdown),
|
368
372
|
'generated_at': timezone.now().isoformat()
|
369
373
|
}
|
370
|
-
|
374
|
+
|
371
375
|
return self._create_success_result(
|
372
376
|
f"Balance statistics for {days} days",
|
373
377
|
stats
|
374
378
|
)
|
375
|
-
|
379
|
+
|
376
380
|
except Exception as e:
|
377
381
|
return self._handle_exception("get_balance_stats", e)
|
378
|
-
|
382
|
+
|
379
383
|
def transfer_funds(
|
380
384
|
self,
|
381
385
|
from_user_id: int,
|
@@ -401,32 +405,32 @@ class BalanceService(BaseService):
|
|
401
405
|
"Transfer amount must be positive",
|
402
406
|
"invalid_amount"
|
403
407
|
)
|
404
|
-
|
408
|
+
|
405
409
|
if from_user_id == to_user_id:
|
406
410
|
return self._create_error_result(
|
407
411
|
"Cannot transfer to same user",
|
408
412
|
"same_user_transfer"
|
409
413
|
)
|
410
|
-
|
414
|
+
|
411
415
|
self.logger.info("Transferring funds", extra={
|
412
416
|
'from_user_id': from_user_id,
|
413
417
|
'to_user_id': to_user_id,
|
414
418
|
'amount': amount
|
415
419
|
})
|
416
|
-
|
420
|
+
|
417
421
|
# Check both users exist
|
418
422
|
if not User.objects.filter(id=from_user_id).exists():
|
419
423
|
return self._create_error_result(
|
420
424
|
f"Source user {from_user_id} not found",
|
421
425
|
"source_user_not_found"
|
422
426
|
)
|
423
|
-
|
427
|
+
|
424
428
|
if not User.objects.filter(id=to_user_id).exists():
|
425
429
|
return self._create_error_result(
|
426
430
|
f"Destination user {to_user_id} not found",
|
427
431
|
"destination_user_not_found"
|
428
432
|
)
|
429
|
-
|
433
|
+
|
430
434
|
# Execute transfer in transaction
|
431
435
|
def transfer_transaction():
|
432
436
|
# Subtract from source
|
@@ -435,29 +439,29 @@ class BalanceService(BaseService):
|
|
435
439
|
amount,
|
436
440
|
f"Transfer to user {to_user_id}: {description}" if description else f"Transfer to user {to_user_id}"
|
437
441
|
)
|
438
|
-
|
442
|
+
|
439
443
|
if not subtract_result.success:
|
440
444
|
raise ValueError(subtract_result.message)
|
441
|
-
|
445
|
+
|
442
446
|
# Add to destination
|
443
447
|
add_result = self.add_funds(
|
444
448
|
to_user_id,
|
445
449
|
amount,
|
446
450
|
f"Transfer from user {from_user_id}: {description}" if description else f"Transfer from user {from_user_id}"
|
447
451
|
)
|
448
|
-
|
452
|
+
|
449
453
|
if not add_result.success:
|
450
454
|
raise ValueError(add_result.message)
|
451
|
-
|
455
|
+
|
452
456
|
return {
|
453
457
|
'from_transaction': subtract_result.transaction_id,
|
454
458
|
'to_transaction': add_result.transaction_id,
|
455
459
|
'from_balance': subtract_result.balance_usd,
|
456
460
|
'to_balance': add_result.balance_usd
|
457
461
|
}
|
458
|
-
|
462
|
+
|
459
463
|
result = self._execute_with_transaction(transfer_transaction)
|
460
|
-
|
464
|
+
|
461
465
|
self._log_operation(
|
462
466
|
"transfer_funds",
|
463
467
|
True,
|
@@ -465,7 +469,7 @@ class BalanceService(BaseService):
|
|
465
469
|
to_user_id=to_user_id,
|
466
470
|
amount=amount
|
467
471
|
)
|
468
|
-
|
472
|
+
|
469
473
|
return self._create_success_result(
|
470
474
|
"Funds transferred successfully",
|
471
475
|
{
|
@@ -478,7 +482,7 @@ class BalanceService(BaseService):
|
|
478
482
|
'to_balance': result['to_balance']
|
479
483
|
}
|
480
484
|
)
|
481
|
-
|
485
|
+
|
482
486
|
except Exception as e:
|
483
487
|
return self._handle_exception(
|
484
488
|
"transfer_funds", e,
|
@@ -486,7 +490,7 @@ class BalanceService(BaseService):
|
|
486
490
|
to_user_id=to_user_id,
|
487
491
|
amount=amount
|
488
492
|
)
|
489
|
-
|
493
|
+
|
490
494
|
def freeze_balance(self, user_id: int, amount: float, reason: str) -> ServiceOperationResult:
|
491
495
|
"""
|
492
496
|
Freeze part of user balance (for future implementation).
|
@@ -504,30 +508,30 @@ class BalanceService(BaseService):
|
|
504
508
|
"Balance freezing not yet implemented",
|
505
509
|
"not_implemented"
|
506
510
|
)
|
507
|
-
|
511
|
+
|
508
512
|
def health_check(self) -> ServiceOperationResult:
|
509
513
|
"""Perform balance service health check."""
|
510
514
|
try:
|
511
515
|
# Check database connectivity
|
512
516
|
balance_count = UserBalance.objects.count()
|
513
517
|
transaction_count = Transaction.objects.count()
|
514
|
-
|
518
|
+
|
515
519
|
# Check for recent activity
|
516
520
|
recent_transactions = Transaction.objects.filter(
|
517
521
|
created_at__gte=timezone.now() - timezone.timedelta(hours=1)
|
518
522
|
).count()
|
519
|
-
|
523
|
+
|
520
524
|
stats = {
|
521
525
|
'total_balances': balance_count,
|
522
526
|
'total_transactions': transaction_count,
|
523
527
|
'recent_transactions': recent_transactions,
|
524
528
|
'service_name': 'BalanceService'
|
525
529
|
}
|
526
|
-
|
530
|
+
|
527
531
|
return self._create_success_result(
|
528
532
|
"BalanceService is healthy",
|
529
533
|
stats
|
530
534
|
)
|
531
|
-
|
535
|
+
|
532
536
|
except Exception as e:
|
533
537
|
return self._handle_exception("health_check", e)
|
@@ -5,12 +5,15 @@ Provides common functionality for all services.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from abc import ABC
|
8
|
-
from typing import
|
8
|
+
from typing import Any, Dict, Optional, Type
|
9
|
+
|
9
10
|
from django.db import transaction
|
11
|
+
|
10
12
|
from django_cfg.modules.django_logging import get_logger
|
11
13
|
|
12
|
-
from ..types import ServiceOperationResult
|
13
14
|
from ...config.django_cfg_integration import PaymentsConfigManager
|
15
|
+
from ..types import ServiceOperationResult
|
16
|
+
|
14
17
|
|
15
18
|
class BaseService(ABC):
|
16
19
|
"""
|
@@ -18,17 +21,17 @@ class BaseService(ABC):
|
|
18
21
|
|
19
22
|
Provides logging, error handling, and transaction management.
|
20
23
|
"""
|
21
|
-
|
24
|
+
|
22
25
|
def __init__(self):
|
23
26
|
"""Initialize base service."""
|
24
27
|
self.logger = get_logger(f"services.{self.__class__.__name__.lower()}")
|
25
28
|
self._cache = {}
|
26
|
-
|
29
|
+
|
27
30
|
# Initialize config manager
|
28
31
|
self.config_manager = PaymentsConfigManager
|
29
|
-
|
32
|
+
|
30
33
|
def _create_success_result(
|
31
|
-
self,
|
34
|
+
self,
|
32
35
|
message: str = "Operation completed successfully",
|
33
36
|
data: Optional[Dict[str, Any]] = None
|
34
37
|
) -> ServiceOperationResult:
|
@@ -38,7 +41,7 @@ class BaseService(ABC):
|
|
38
41
|
message=message,
|
39
42
|
data=data or {}
|
40
43
|
)
|
41
|
-
|
44
|
+
|
42
45
|
def _create_error_result(
|
43
46
|
self,
|
44
47
|
message: str,
|
@@ -52,7 +55,7 @@ class BaseService(ABC):
|
|
52
55
|
error_code=error_code,
|
53
56
|
data=data or {}
|
54
57
|
)
|
55
|
-
|
58
|
+
|
56
59
|
def _log_operation(
|
57
60
|
self,
|
58
61
|
operation: str,
|
@@ -66,12 +69,12 @@ class BaseService(ABC):
|
|
66
69
|
'success': success,
|
67
70
|
**kwargs
|
68
71
|
}
|
69
|
-
|
72
|
+
|
70
73
|
if success:
|
71
74
|
self.logger.info(f"Operation {operation} completed successfully", extra=log_data)
|
72
75
|
else:
|
73
76
|
self.logger.error(f"Operation {operation} failed", extra=log_data)
|
74
|
-
|
77
|
+
|
75
78
|
def _handle_exception(
|
76
79
|
self,
|
77
80
|
operation: str,
|
@@ -80,7 +83,7 @@ class BaseService(ABC):
|
|
80
83
|
) -> ServiceOperationResult:
|
81
84
|
"""Handle service exception."""
|
82
85
|
error_message = f"Service error in {operation}: {str(exception)}"
|
83
|
-
|
86
|
+
|
84
87
|
self.logger.error(error_message, extra={
|
85
88
|
'service': self.__class__.__name__,
|
86
89
|
'operation': operation,
|
@@ -88,13 +91,13 @@ class BaseService(ABC):
|
|
88
91
|
'exception_message': str(exception),
|
89
92
|
**context
|
90
93
|
}, exc_info=True)
|
91
|
-
|
94
|
+
|
92
95
|
return self._create_error_result(
|
93
96
|
message=error_message,
|
94
97
|
error_code=type(exception).__name__.lower(),
|
95
98
|
data={'context': context}
|
96
99
|
)
|
97
|
-
|
100
|
+
|
98
101
|
@transaction.atomic
|
99
102
|
def _execute_with_transaction(self, operation_func, *args, **kwargs):
|
100
103
|
"""Execute operation within database transaction."""
|
@@ -103,7 +106,7 @@ class BaseService(ABC):
|
|
103
106
|
except Exception as e:
|
104
107
|
self.logger.error(f"Transaction rolled back due to error: {e}")
|
105
108
|
raise
|
106
|
-
|
109
|
+
|
107
110
|
def _validate_input(self, data: Any, model_class: Type) -> Any:
|
108
111
|
"""Validate input data using Pydantic model."""
|
109
112
|
try:
|
@@ -115,26 +118,26 @@ class BaseService(ABC):
|
|
115
118
|
return model_class.model_validate(data)
|
116
119
|
except Exception as e:
|
117
120
|
raise ValueError(f"Invalid input data: {e}")
|
118
|
-
|
121
|
+
|
119
122
|
def _get_cache_key(self, prefix: str, *args) -> str:
|
120
123
|
"""Generate cache key."""
|
121
124
|
key_parts = [prefix] + [str(arg) for arg in args]
|
122
125
|
return ":".join(key_parts)
|
123
|
-
|
126
|
+
|
124
127
|
def _cache_get(self, key: str) -> Optional[Any]:
|
125
128
|
"""Get value from cache."""
|
126
129
|
return self._cache.get(key)
|
127
|
-
|
130
|
+
|
128
131
|
def _cache_set(self, key: str, value: Any, ttl: int = 300) -> None:
|
129
132
|
"""Set value in cache."""
|
130
133
|
# Simple in-memory cache for now
|
131
134
|
# In production, this would use Redis
|
132
135
|
self._cache[key] = value
|
133
|
-
|
136
|
+
|
134
137
|
def _cache_delete(self, key: str) -> None:
|
135
138
|
"""Delete value from cache."""
|
136
139
|
self._cache.pop(key, None)
|
137
|
-
|
140
|
+
|
138
141
|
def _cache_clear(self, prefix: Optional[str] = None) -> None:
|
139
142
|
"""Clear cache entries."""
|
140
143
|
if prefix:
|
@@ -143,7 +146,7 @@ class BaseService(ABC):
|
|
143
146
|
del self._cache[key]
|
144
147
|
else:
|
145
148
|
self._cache.clear()
|
146
|
-
|
149
|
+
|
147
150
|
def get_service_stats(self) -> Dict[str, Any]:
|
148
151
|
"""Get service statistics."""
|
149
152
|
return {
|
@@ -151,13 +154,13 @@ class BaseService(ABC):
|
|
151
154
|
'cache_size': len(self._cache),
|
152
155
|
'cache_keys': list(self._cache.keys())
|
153
156
|
}
|
154
|
-
|
157
|
+
|
155
158
|
def health_check(self) -> ServiceOperationResult:
|
156
159
|
"""Perform service health check."""
|
157
160
|
try:
|
158
161
|
# Basic health check - can be overridden by subclasses
|
159
162
|
stats = self.get_service_stats()
|
160
|
-
|
163
|
+
|
161
164
|
return self._create_success_result(
|
162
165
|
message=f"{self.__class__.__name__} is healthy",
|
163
166
|
data=stats
|
@@ -4,8 +4,8 @@ Currency operations for payment service.
|
|
4
4
|
Provides currency validation and conversion functionality.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from .currency_validator import CurrencyValidator
|
8
7
|
from .currency_converter import CurrencyConverter
|
8
|
+
from .currency_validator import CurrencyValidator
|
9
9
|
|
10
10
|
__all__ = [
|
11
11
|
'CurrencyValidator',
|