django-cfg 1.4.21__py3-none-any.whl → 1.4.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -6,6 +6,7 @@ Optimized querysets and managers for balance and transaction operations.
|
|
6
6
|
|
7
7
|
from django.db import models, transaction
|
8
8
|
from django.utils import timezone
|
9
|
+
|
9
10
|
from django_cfg.modules.django_logging import get_logger
|
10
11
|
|
11
12
|
logger = get_logger("balance_managers")
|
@@ -17,7 +18,7 @@ class UserBalanceManager(models.Manager):
|
|
17
18
|
|
18
19
|
Provides methods for balance management and atomic operations.
|
19
20
|
"""
|
20
|
-
|
21
|
+
|
21
22
|
def get_or_create_for_user(self, user):
|
22
23
|
"""
|
23
24
|
Get or create balance for user.
|
@@ -32,16 +33,16 @@ class UserBalanceManager(models.Manager):
|
|
32
33
|
user=user,
|
33
34
|
defaults={'balance_usd': 0.0}
|
34
35
|
)
|
35
|
-
|
36
|
+
|
36
37
|
if created:
|
37
|
-
logger.info(
|
38
|
+
logger.info("Created new balance for user", extra={
|
38
39
|
'user_id': user.id,
|
39
40
|
'initial_balance': 0.0
|
40
41
|
})
|
41
|
-
|
42
|
+
|
42
43
|
return balance
|
43
|
-
|
44
|
-
def add_funds_to_user(self, user, amount, transaction_type='deposit',
|
44
|
+
|
45
|
+
def add_funds_to_user(self, user, amount, transaction_type='deposit',
|
45
46
|
description=None, payment_id=None):
|
46
47
|
"""
|
47
48
|
Add funds to user balance atomically (business logic in manager).
|
@@ -58,10 +59,10 @@ class UserBalanceManager(models.Manager):
|
|
58
59
|
"""
|
59
60
|
if amount <= 0:
|
60
61
|
raise ValueError("Amount must be positive")
|
61
|
-
|
62
|
+
|
62
63
|
# Get or create balance
|
63
64
|
balance = self.get_or_create_for_user(user)
|
64
|
-
|
65
|
+
|
65
66
|
with transaction.atomic():
|
66
67
|
# Update balance
|
67
68
|
balance.balance_usd += amount
|
@@ -70,7 +71,7 @@ class UserBalanceManager(models.Manager):
|
|
70
71
|
balance.save(update_fields=[
|
71
72
|
'balance_usd', 'total_deposited', 'last_transaction_at', 'updated_at'
|
72
73
|
])
|
73
|
-
|
74
|
+
|
74
75
|
# Create transaction record
|
75
76
|
from ..balance import Transaction
|
76
77
|
transaction_record = Transaction.objects.create(
|
@@ -81,20 +82,20 @@ class UserBalanceManager(models.Manager):
|
|
81
82
|
description=description or f"Added ${amount:.2f} to balance",
|
82
83
|
payment_id=payment_id
|
83
84
|
)
|
84
|
-
|
85
|
-
logger.info(
|
85
|
+
|
86
|
+
logger.info("Added funds to user balance", extra={
|
86
87
|
'user_id': user.id,
|
87
88
|
'amount': amount,
|
88
89
|
'new_balance': balance.balance_usd,
|
89
90
|
'transaction_id': str(transaction_record.id),
|
90
91
|
'payment_id': payment_id
|
91
92
|
})
|
92
|
-
|
93
|
+
|
93
94
|
# Update analytics
|
94
95
|
self.update_balance_analytics(user, amount)
|
95
|
-
|
96
|
+
|
96
97
|
return transaction_record
|
97
|
-
|
98
|
+
|
98
99
|
def subtract_funds_from_user(self, user, amount, transaction_type='withdrawal',
|
99
100
|
description=None, payment_id=None):
|
100
101
|
"""
|
@@ -112,16 +113,16 @@ class UserBalanceManager(models.Manager):
|
|
112
113
|
"""
|
113
114
|
if amount <= 0:
|
114
115
|
raise ValueError("Amount must be positive")
|
115
|
-
|
116
|
+
|
116
117
|
# Get balance
|
117
118
|
try:
|
118
119
|
balance = self.get(user=user)
|
119
120
|
except self.model.DoesNotExist:
|
120
121
|
raise ValueError("User has no balance record")
|
121
|
-
|
122
|
+
|
122
123
|
if amount > balance.balance_usd:
|
123
124
|
raise ValueError(f"Insufficient balance: ${balance.balance_usd:.2f} < ${amount:.2f}")
|
124
|
-
|
125
|
+
|
125
126
|
with transaction.atomic():
|
126
127
|
# Update balance
|
127
128
|
balance.balance_usd -= amount
|
@@ -130,7 +131,7 @@ class UserBalanceManager(models.Manager):
|
|
130
131
|
balance.save(update_fields=[
|
131
132
|
'balance_usd', 'total_spent', 'last_transaction_at', 'updated_at'
|
132
133
|
])
|
133
|
-
|
134
|
+
|
134
135
|
# Create transaction record
|
135
136
|
from ..balance import Transaction
|
136
137
|
transaction_record = Transaction.objects.create(
|
@@ -141,20 +142,20 @@ class UserBalanceManager(models.Manager):
|
|
141
142
|
description=description or f"Subtracted ${amount:.2f} from balance",
|
142
143
|
payment_id=payment_id
|
143
144
|
)
|
144
|
-
|
145
|
-
logger.info(
|
145
|
+
|
146
|
+
logger.info("Subtracted funds from user balance", extra={
|
146
147
|
'user_id': user.id,
|
147
148
|
'amount': amount,
|
148
149
|
'new_balance': balance.balance_usd,
|
149
150
|
'transaction_id': str(transaction_record.id),
|
150
151
|
'payment_id': payment_id
|
151
152
|
})
|
152
|
-
|
153
|
+
|
153
154
|
# Update analytics
|
154
155
|
self.update_balance_analytics(user, -amount)
|
155
|
-
|
156
|
+
|
156
157
|
return transaction_record
|
157
|
-
|
158
|
+
|
158
159
|
def update_balance_analytics(self, user, balance_change):
|
159
160
|
"""
|
160
161
|
Update balance analytics in cache (moved from signals).
|
@@ -165,43 +166,43 @@ class UserBalanceManager(models.Manager):
|
|
165
166
|
"""
|
166
167
|
try:
|
167
168
|
from django.core.cache import cache
|
168
|
-
|
169
|
+
|
169
170
|
user_id = user.id
|
170
|
-
|
171
|
+
|
171
172
|
# Update balance history
|
172
173
|
history_key = f"balance_history:{user_id}"
|
173
174
|
history = cache.get(history_key, [])
|
174
|
-
|
175
|
+
|
175
176
|
history.append({
|
176
177
|
'timestamp': timezone.now().isoformat(),
|
177
178
|
'balance': self.get_or_create_for_user(user).balance_usd,
|
178
179
|
'change': balance_change
|
179
180
|
})
|
180
|
-
|
181
|
+
|
181
182
|
# Keep only last 100 entries
|
182
183
|
if len(history) > 100:
|
183
184
|
history = history[-100:]
|
184
|
-
|
185
|
+
|
185
186
|
cache.set(history_key, history, timeout=86400 * 7) # 7 days
|
186
|
-
|
187
|
+
|
187
188
|
# Update daily totals
|
188
189
|
today = timezone.now().date().isoformat()
|
189
190
|
daily_key = f"balance_changes:{user_id}:{today}"
|
190
|
-
|
191
|
+
|
191
192
|
daily_data = cache.get(daily_key, {'total_change': 0.0, 'transaction_count': 0})
|
192
193
|
daily_data['total_change'] += balance_change
|
193
194
|
daily_data['transaction_count'] += 1
|
194
|
-
|
195
|
+
|
195
196
|
cache.set(daily_key, daily_data, timeout=86400 * 2) # 2 days
|
196
|
-
|
197
|
-
logger.debug(
|
197
|
+
|
198
|
+
logger.debug("Updated balance analytics", extra={
|
198
199
|
'user_id': user_id,
|
199
200
|
'balance_change': balance_change,
|
200
201
|
'total_change_today': daily_data['total_change']
|
201
202
|
})
|
202
|
-
|
203
|
+
|
203
204
|
except Exception as e:
|
204
|
-
logger.warning(
|
205
|
+
logger.warning("Failed to update balance analytics", extra={
|
205
206
|
'user_id': user.id,
|
206
207
|
'error': str(e)
|
207
208
|
})
|
@@ -213,61 +214,61 @@ class TransactionQuerySet(models.QuerySet):
|
|
213
214
|
|
214
215
|
Provides efficient queries for transaction history and analysis.
|
215
216
|
"""
|
216
|
-
|
217
|
+
|
217
218
|
def optimized(self):
|
218
219
|
"""Prevent N+1 queries with select_related."""
|
219
220
|
return self.select_related('user')
|
220
|
-
|
221
|
+
|
221
222
|
def by_user(self, user):
|
222
223
|
"""Filter transactions by user."""
|
223
224
|
return self.filter(user=user)
|
224
|
-
|
225
|
+
|
225
226
|
def by_type(self, transaction_type):
|
226
227
|
"""Filter by transaction type."""
|
227
228
|
return self.filter(transaction_type=transaction_type)
|
228
|
-
|
229
|
+
|
229
230
|
def by_payment(self, payment_id):
|
230
231
|
"""Filter by related payment ID."""
|
231
232
|
return self.filter(payment_id=payment_id)
|
232
|
-
|
233
|
+
|
233
234
|
# Transaction type filters
|
234
235
|
def deposits(self):
|
235
236
|
"""Get deposit transactions (positive amounts)."""
|
236
237
|
return self.filter(transaction_type='deposit', amount_usd__gt=0)
|
237
|
-
|
238
|
+
|
238
239
|
def withdrawals(self):
|
239
240
|
"""Get withdrawal transactions (negative amounts)."""
|
240
241
|
return self.filter(transaction_type='withdrawal', amount_usd__lt=0)
|
241
|
-
|
242
|
+
|
242
243
|
def payments(self):
|
243
244
|
"""Get payment-related transactions."""
|
244
245
|
return self.filter(transaction_type='payment')
|
245
|
-
|
246
|
+
|
246
247
|
def refunds(self):
|
247
248
|
"""Get refund transactions."""
|
248
249
|
return self.filter(transaction_type='refund')
|
249
|
-
|
250
|
+
|
250
251
|
def fees(self):
|
251
252
|
"""Get fee transactions."""
|
252
253
|
return self.filter(transaction_type='fee')
|
253
|
-
|
254
|
+
|
254
255
|
def bonuses(self):
|
255
256
|
"""Get bonus transactions."""
|
256
257
|
return self.filter(transaction_type='bonus')
|
257
|
-
|
258
|
+
|
258
259
|
def adjustments(self):
|
259
260
|
"""Get adjustment transactions."""
|
260
261
|
return self.filter(transaction_type='adjustment')
|
261
|
-
|
262
|
+
|
262
263
|
# Amount-based filters
|
263
264
|
def credits(self):
|
264
265
|
"""Get credit transactions (positive amounts)."""
|
265
266
|
return self.filter(amount_usd__gt=0)
|
266
|
-
|
267
|
+
|
267
268
|
def debits(self):
|
268
269
|
"""Get debit transactions (negative amounts)."""
|
269
270
|
return self.filter(amount_usd__lt=0)
|
270
|
-
|
271
|
+
|
271
272
|
def large_amounts(self, threshold=100.0):
|
272
273
|
"""
|
273
274
|
Get transactions above threshold amount.
|
@@ -276,7 +277,7 @@ class TransactionQuerySet(models.QuerySet):
|
|
276
277
|
threshold: USD amount threshold (default: $100)
|
277
278
|
"""
|
278
279
|
return self.filter(amount_usd__gte=threshold)
|
279
|
-
|
280
|
+
|
280
281
|
def small_amounts(self, threshold=10.0):
|
281
282
|
"""
|
282
283
|
Get transactions below threshold amount.
|
@@ -285,7 +286,7 @@ class TransactionQuerySet(models.QuerySet):
|
|
285
286
|
threshold: USD amount threshold (default: $10)
|
286
287
|
"""
|
287
288
|
return self.filter(amount_usd__lte=threshold)
|
288
|
-
|
289
|
+
|
289
290
|
# Time-based filters
|
290
291
|
def recent(self, hours=24):
|
291
292
|
"""
|
@@ -296,22 +297,22 @@ class TransactionQuerySet(models.QuerySet):
|
|
296
297
|
"""
|
297
298
|
since = timezone.now() - timezone.timedelta(hours=hours)
|
298
299
|
return self.filter(created_at__gte=since)
|
299
|
-
|
300
|
+
|
300
301
|
def today(self):
|
301
302
|
"""Get transactions created today."""
|
302
303
|
today = timezone.now().date()
|
303
304
|
return self.filter(created_at__date=today)
|
304
|
-
|
305
|
+
|
305
306
|
def this_week(self):
|
306
307
|
"""Get transactions from this week."""
|
307
308
|
week_start = timezone.now().date() - timezone.timedelta(days=timezone.now().weekday())
|
308
309
|
return self.filter(created_at__date__gte=week_start)
|
309
|
-
|
310
|
+
|
310
311
|
def this_month(self):
|
311
312
|
"""Get transactions from this month."""
|
312
313
|
month_start = timezone.now().replace(day=1).date()
|
313
314
|
return self.filter(created_at__date__gte=month_start)
|
314
|
-
|
315
|
+
|
315
316
|
def date_range(self, start_date, end_date):
|
316
317
|
"""
|
317
318
|
Get transactions within date range.
|
@@ -321,35 +322,35 @@ class TransactionQuerySet(models.QuerySet):
|
|
321
322
|
end_date: End date (inclusive)
|
322
323
|
"""
|
323
324
|
return self.filter(created_at__date__range=[start_date, end_date])
|
324
|
-
|
325
|
+
|
325
326
|
# Aggregation methods
|
326
327
|
def total_amount(self):
|
327
328
|
"""Get total amount for queryset."""
|
328
329
|
result = self.aggregate(total=models.Sum('amount_usd'))
|
329
330
|
return result['total'] or 0.0
|
330
|
-
|
331
|
+
|
331
332
|
def total_credits(self):
|
332
333
|
"""Get total credit amount."""
|
333
334
|
result = self.credits().aggregate(total=models.Sum('amount_usd'))
|
334
335
|
return result['total'] or 0.0
|
335
|
-
|
336
|
+
|
336
337
|
def total_debits(self):
|
337
338
|
"""Get total debit amount (absolute value)."""
|
338
339
|
result = self.debits().aggregate(total=models.Sum('amount_usd'))
|
339
340
|
return abs(result['total'] or 0.0)
|
340
|
-
|
341
|
+
|
341
342
|
def average_amount(self):
|
342
343
|
"""Get average transaction amount."""
|
343
344
|
result = self.aggregate(avg=models.Avg('amount_usd'))
|
344
345
|
return result['avg'] or 0.0
|
345
|
-
|
346
|
+
|
346
347
|
def count_by_type(self):
|
347
348
|
"""Get count of transactions grouped by type."""
|
348
349
|
return self.values('transaction_type').annotate(
|
349
350
|
count=models.Count('id'),
|
350
351
|
total_amount=models.Sum('amount_usd')
|
351
352
|
).order_by('transaction_type')
|
352
|
-
|
353
|
+
|
353
354
|
def daily_summary(self, days=30):
|
354
355
|
"""
|
355
356
|
Get daily transaction summary for the last N days.
|
@@ -374,58 +375,58 @@ class TransactionManager(models.Manager):
|
|
374
375
|
|
375
376
|
Provides high-level methods for transaction analysis and reporting.
|
376
377
|
"""
|
377
|
-
|
378
|
+
|
378
379
|
def get_queryset(self):
|
379
380
|
"""Return optimized queryset by default."""
|
380
381
|
return TransactionQuerySet(self.model, using=self._db)
|
381
|
-
|
382
|
+
|
382
383
|
def optimized(self):
|
383
384
|
"""Get optimized queryset."""
|
384
385
|
return self.get_queryset().optimized()
|
385
|
-
|
386
|
+
|
386
387
|
# User-based methods
|
387
388
|
def by_user(self, user):
|
388
389
|
"""Get transactions by user."""
|
389
390
|
return self.get_queryset().by_user(user)
|
390
|
-
|
391
|
+
|
391
392
|
def by_type(self, transaction_type):
|
392
393
|
"""Get transactions by type."""
|
393
394
|
return self.get_queryset().by_type(transaction_type)
|
394
|
-
|
395
|
+
|
395
396
|
# Transaction type methods
|
396
397
|
def deposits(self):
|
397
398
|
"""Get deposit transactions."""
|
398
399
|
return self.get_queryset().deposits()
|
399
|
-
|
400
|
+
|
400
401
|
def withdrawals(self):
|
401
402
|
"""Get withdrawal transactions."""
|
402
403
|
return self.get_queryset().withdrawals()
|
403
|
-
|
404
|
+
|
404
405
|
def payments(self):
|
405
406
|
"""Get payment transactions."""
|
406
407
|
return self.get_queryset().payments()
|
407
|
-
|
408
|
+
|
408
409
|
def refunds(self):
|
409
410
|
"""Get refund transactions."""
|
410
411
|
return self.get_queryset().refunds()
|
411
|
-
|
412
|
+
|
412
413
|
# Time-based methods
|
413
414
|
def recent(self, hours=24):
|
414
415
|
"""Get recent transactions."""
|
415
416
|
return self.get_queryset().recent(hours)
|
416
|
-
|
417
|
+
|
417
418
|
def today(self):
|
418
419
|
"""Get today's transactions."""
|
419
420
|
return self.get_queryset().today()
|
420
|
-
|
421
|
+
|
421
422
|
def this_week(self):
|
422
423
|
"""Get this week's transactions."""
|
423
424
|
return self.get_queryset().this_week()
|
424
|
-
|
425
|
+
|
425
426
|
def this_month(self):
|
426
427
|
"""Get this month's transactions."""
|
427
428
|
return self.get_queryset().this_month()
|
428
|
-
|
429
|
+
|
429
430
|
# Analysis methods
|
430
431
|
def get_user_balance_history(self, user, days=30):
|
431
432
|
"""
|
@@ -441,10 +442,10 @@ class TransactionManager(models.Manager):
|
|
441
442
|
transactions = self.by_user(user).filter(
|
442
443
|
created_at__gte=timezone.now() - timezone.timedelta(days=days)
|
443
444
|
).order_by('created_at')
|
444
|
-
|
445
|
+
|
445
446
|
history = []
|
446
447
|
current_balance = 0.0
|
447
|
-
|
448
|
+
|
448
449
|
for transaction in transactions:
|
449
450
|
current_balance = transaction.balance_after
|
450
451
|
history.append({
|
@@ -454,9 +455,9 @@ class TransactionManager(models.Manager):
|
|
454
455
|
'transaction_type': transaction.transaction_type,
|
455
456
|
'amount': transaction.amount_usd
|
456
457
|
})
|
457
|
-
|
458
|
+
|
458
459
|
return history
|
459
|
-
|
460
|
+
|
460
461
|
def get_transaction_stats(self, user=None, days=30):
|
461
462
|
"""
|
462
463
|
Get transaction statistics.
|
@@ -471,10 +472,10 @@ class TransactionManager(models.Manager):
|
|
471
472
|
queryset = self.get_queryset()
|
472
473
|
if user:
|
473
474
|
queryset = queryset.by_user(user)
|
474
|
-
|
475
|
+
|
475
476
|
since = timezone.now() - timezone.timedelta(days=days)
|
476
477
|
queryset = queryset.filter(created_at__gte=since)
|
477
|
-
|
478
|
+
|
478
479
|
stats = {
|
479
480
|
'total_transactions': queryset.count(),
|
480
481
|
'total_amount': queryset.total_amount(),
|
@@ -487,16 +488,16 @@ class TransactionManager(models.Manager):
|
|
487
488
|
'payments_count': queryset.payments().count(),
|
488
489
|
'refunds_count': queryset.refunds().count(),
|
489
490
|
}
|
490
|
-
|
491
|
+
|
491
492
|
logger.info(f"Generated transaction stats for {days} days", extra={
|
492
493
|
'user_id': user.id if user else None,
|
493
494
|
'days': days,
|
494
495
|
'total_transactions': stats['total_transactions'],
|
495
496
|
'total_amount': stats['total_amount']
|
496
497
|
})
|
497
|
-
|
498
|
+
|
498
499
|
return stats
|
499
|
-
|
500
|
+
|
500
501
|
def get_daily_summary(self, days=30):
|
501
502
|
"""
|
502
503
|
Get daily transaction summary.
|
@@ -508,7 +509,7 @@ class TransactionManager(models.Manager):
|
|
508
509
|
QuerySet: Daily summary data
|
509
510
|
"""
|
510
511
|
return self.get_queryset().daily_summary(days)
|
511
|
-
|
512
|
+
|
512
513
|
def create_deposit(self, user, amount, description=None, payment_id=None, metadata=None):
|
513
514
|
"""
|
514
515
|
Create a deposit transaction.
|
@@ -525,11 +526,11 @@ class TransactionManager(models.Manager):
|
|
525
526
|
"""
|
526
527
|
if amount <= 0:
|
527
528
|
raise ValueError("Deposit amount must be positive")
|
528
|
-
|
529
|
+
|
529
530
|
# Get or create user balance
|
530
531
|
from ..balance import UserBalance
|
531
532
|
balance = UserBalance.get_or_create_for_user(user)
|
532
|
-
|
533
|
+
|
533
534
|
# Create transaction via balance method (ensures atomicity)
|
534
535
|
transaction = balance.add_funds(
|
535
536
|
amount=amount,
|
@@ -537,21 +538,21 @@ class TransactionManager(models.Manager):
|
|
537
538
|
description=description or f"Deposit of ${amount:.2f}",
|
538
539
|
payment_id=payment_id
|
539
540
|
)
|
540
|
-
|
541
|
+
|
541
542
|
# Add metadata if provided
|
542
543
|
if metadata:
|
543
544
|
transaction.metadata = metadata
|
544
545
|
transaction.save(update_fields=['metadata'])
|
545
|
-
|
546
|
-
logger.info(
|
546
|
+
|
547
|
+
logger.info("Created deposit transaction", extra={
|
547
548
|
'user_id': user.id,
|
548
549
|
'amount': amount,
|
549
550
|
'transaction_id': str(transaction.id),
|
550
551
|
'payment_id': payment_id
|
551
552
|
})
|
552
|
-
|
553
|
+
|
553
554
|
return transaction
|
554
|
-
|
555
|
+
|
555
556
|
def create_withdrawal(self, user, amount, description=None, payment_id=None, metadata=None):
|
556
557
|
"""
|
557
558
|
Create a withdrawal transaction.
|
@@ -568,14 +569,14 @@ class TransactionManager(models.Manager):
|
|
568
569
|
"""
|
569
570
|
if amount <= 0:
|
570
571
|
raise ValueError("Withdrawal amount must be positive")
|
571
|
-
|
572
|
+
|
572
573
|
# Get user balance
|
573
574
|
from ..balance import UserBalance
|
574
575
|
try:
|
575
576
|
balance = UserBalance.objects.get(user=user)
|
576
577
|
except UserBalance.DoesNotExist:
|
577
578
|
raise ValueError("User has no balance record")
|
578
|
-
|
579
|
+
|
579
580
|
# Create transaction via balance method (ensures atomicity)
|
580
581
|
transaction = balance.subtract_funds(
|
581
582
|
amount=amount,
|
@@ -583,17 +584,17 @@ class TransactionManager(models.Manager):
|
|
583
584
|
description=description or f"Withdrawal of ${amount:.2f}",
|
584
585
|
payment_id=payment_id
|
585
586
|
)
|
586
|
-
|
587
|
+
|
587
588
|
# Add metadata if provided
|
588
589
|
if metadata:
|
589
590
|
transaction.metadata = metadata
|
590
591
|
transaction.save(update_fields=['metadata'])
|
591
|
-
|
592
|
-
logger.info(
|
592
|
+
|
593
|
+
logger.info("Created withdrawal transaction", extra={
|
593
594
|
'user_id': user.id,
|
594
595
|
'amount': amount,
|
595
596
|
'transaction_id': str(transaction.id),
|
596
597
|
'payment_id': payment_id
|
597
598
|
})
|
598
|
-
|
599
|
+
|
599
600
|
return transaction
|