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,25 +4,23 @@ Admin Payment ViewSets.
|
|
4
4
|
DRF ViewSets for payment management in admin interface.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from
|
7
|
+
from datetime import timedelta
|
8
|
+
|
9
|
+
from django.db.models import Count, Sum
|
10
|
+
from django.utils import timezone
|
11
|
+
from rest_framework import serializers, status
|
8
12
|
from rest_framework.decorators import action
|
9
13
|
from rest_framework.response import Response
|
10
|
-
from rest_framework import serializers
|
11
|
-
from django_filters.rest_framework import DjangoFilterBackend
|
12
|
-
from rest_framework.filters import SearchFilter, OrderingFilter
|
13
|
-
from django.db.models import Count, Sum, Avg, Q
|
14
|
-
from django.utils import timezone
|
15
|
-
from datetime import timedelta
|
16
14
|
|
17
|
-
from django_cfg.apps.payments.admin_interface.views.base import AdminBaseViewSet
|
18
|
-
from django_cfg.apps.payments.models import UniversalPayment
|
19
15
|
from django_cfg.apps.payments.admin_interface.serializers import (
|
20
|
-
AdminPaymentListSerializer,
|
21
|
-
AdminPaymentDetailSerializer,
|
22
16
|
AdminPaymentCreateSerializer,
|
23
|
-
|
17
|
+
AdminPaymentDetailSerializer,
|
18
|
+
AdminPaymentListSerializer,
|
24
19
|
AdminPaymentStatsSerializer,
|
20
|
+
AdminPaymentUpdateSerializer,
|
25
21
|
)
|
22
|
+
from django_cfg.apps.payments.admin_interface.views.base import AdminBaseViewSet
|
23
|
+
from django_cfg.apps.payments.models import UniversalPayment
|
26
24
|
from django_cfg.modules.django_logging import get_logger
|
27
25
|
|
28
26
|
logger = get_logger("admin_payment_api")
|
@@ -34,10 +32,10 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
34
32
|
|
35
33
|
Provides full CRUD operations for payments with admin-specific features.
|
36
34
|
"""
|
37
|
-
|
35
|
+
|
38
36
|
queryset = UniversalPayment.objects.select_related('user').order_by('-created_at')
|
39
37
|
serializer_class = AdminPaymentDetailSerializer
|
40
|
-
|
38
|
+
|
41
39
|
serializer_classes = {
|
42
40
|
'list': AdminPaymentListSerializer,
|
43
41
|
'create': AdminPaymentCreateSerializer,
|
@@ -45,24 +43,24 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
45
43
|
'partial_update': AdminPaymentUpdateSerializer,
|
46
44
|
'stats': AdminPaymentStatsSerializer,
|
47
45
|
}
|
48
|
-
|
46
|
+
|
49
47
|
filterset_fields = ['status', 'provider', 'currency__code', 'user']
|
50
48
|
search_fields = ['internal_payment_id', 'transaction_hash', 'description', 'user__username', 'user__email']
|
51
49
|
ordering_fields = ['created_at', 'amount_usd', 'status']
|
52
|
-
|
50
|
+
|
53
51
|
def get_queryset(self):
|
54
52
|
"""Optimized queryset for admin interface."""
|
55
53
|
queryset = super().get_queryset()
|
56
|
-
|
54
|
+
|
57
55
|
# Add filters based on query params
|
58
56
|
status_filter = self.request.query_params.get('status')
|
59
57
|
if status_filter:
|
60
58
|
queryset = queryset.filter(status=status_filter)
|
61
|
-
|
59
|
+
|
62
60
|
provider_filter = self.request.query_params.get('provider')
|
63
61
|
if provider_filter:
|
64
62
|
queryset = queryset.filter(provider=provider_filter)
|
65
|
-
|
63
|
+
|
66
64
|
# Date range filter
|
67
65
|
date_from = self.request.query_params.get('date_from')
|
68
66
|
date_to = self.request.query_params.get('date_to')
|
@@ -70,13 +68,13 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
70
68
|
queryset = queryset.filter(created_at__gte=date_from)
|
71
69
|
if date_to:
|
72
70
|
queryset = queryset.filter(created_at__lte=date_to)
|
73
|
-
|
71
|
+
|
74
72
|
return queryset
|
75
|
-
|
73
|
+
|
76
74
|
def create(self, request, *args, **kwargs):
|
77
75
|
"""Create payment with enhanced error handling."""
|
78
76
|
serializer = self.get_serializer(data=request.data)
|
79
|
-
|
77
|
+
|
80
78
|
if serializer.is_valid():
|
81
79
|
try:
|
82
80
|
payment = serializer.save()
|
@@ -89,9 +87,9 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
89
87
|
error_message = str(e.detail[0])
|
90
88
|
elif hasattr(e, 'detail') and isinstance(e.detail, dict):
|
91
89
|
# Handle field-specific errors
|
92
|
-
error_message = '; '.join([f"{field}: {', '.join(errors) if isinstance(errors, list) else errors}"
|
90
|
+
error_message = '; '.join([f"{field}: {', '.join(errors) if isinstance(errors, list) else errors}"
|
93
91
|
for field, errors in e.detail.items()])
|
94
|
-
|
92
|
+
|
95
93
|
return Response(
|
96
94
|
{
|
97
95
|
'success': False,
|
@@ -108,7 +106,7 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
108
106
|
error_messages.extend([str(error) for error in errors])
|
109
107
|
else:
|
110
108
|
error_messages.append(str(errors))
|
111
|
-
|
109
|
+
|
112
110
|
error_message = '; '.join(error_messages)
|
113
111
|
return Response(
|
114
112
|
{
|
@@ -119,24 +117,24 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
119
117
|
},
|
120
118
|
status=status.HTTP_400_BAD_REQUEST
|
121
119
|
)
|
122
|
-
|
120
|
+
|
123
121
|
@action(detail=False, methods=['get'])
|
124
122
|
def stats(self, request):
|
125
123
|
"""Get comprehensive payment statistics."""
|
126
124
|
queryset = self.get_queryset()
|
127
|
-
|
125
|
+
|
128
126
|
# Basic stats
|
129
127
|
total_payments = queryset.count()
|
130
128
|
total_amount = queryset.aggregate(Sum('amount_usd'))['amount_usd__sum'] or 0
|
131
|
-
|
129
|
+
|
132
130
|
# Status breakdown
|
133
131
|
status_stats = queryset.values('status').annotate(count=Count('id'))
|
134
132
|
successful = sum(s['count'] for s in status_stats if s['status'] in ['completed', 'confirmed'])
|
135
133
|
failed = sum(s['count'] for s in status_stats if s['status'] == 'failed')
|
136
134
|
pending = sum(s['count'] for s in status_stats if s['status'] in ['pending', 'confirming'])
|
137
|
-
|
135
|
+
|
138
136
|
success_rate = (successful / total_payments * 100) if total_payments > 0 else 0
|
139
|
-
|
137
|
+
|
140
138
|
# Provider breakdown
|
141
139
|
provider_stats = {}
|
142
140
|
for provider_data in queryset.values('provider').annotate(
|
@@ -147,7 +145,7 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
147
145
|
'count': provider_data['count'],
|
148
146
|
'total_amount': provider_data['total_amount'] or 0,
|
149
147
|
}
|
150
|
-
|
148
|
+
|
151
149
|
# Currency breakdown
|
152
150
|
currency_stats = {}
|
153
151
|
for currency_data in queryset.values('currency_code').annotate(
|
@@ -158,7 +156,7 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
158
156
|
'count': currency_data['count'],
|
159
157
|
'total_amount': currency_data['total_amount'] or 0,
|
160
158
|
}
|
161
|
-
|
159
|
+
|
162
160
|
# Time-based stats
|
163
161
|
now = timezone.now()
|
164
162
|
last_24h = queryset.filter(created_at__gte=now - timedelta(hours=24)).aggregate(
|
@@ -173,7 +171,7 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
173
171
|
count=Count('id'),
|
174
172
|
amount=Sum('amount_usd')
|
175
173
|
)
|
176
|
-
|
174
|
+
|
177
175
|
stats_data = {
|
178
176
|
'total_payments': total_payments,
|
179
177
|
'total_amount_usd': total_amount,
|
@@ -196,76 +194,76 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
196
194
|
'amount': last_30d['amount'] or 0,
|
197
195
|
},
|
198
196
|
}
|
199
|
-
|
197
|
+
|
200
198
|
serializer = self.get_serializer(stats_data)
|
201
199
|
return Response(serializer.data)
|
202
|
-
|
200
|
+
|
203
201
|
@action(detail=True, methods=['post'])
|
204
202
|
def cancel(self, request, pk=None):
|
205
203
|
"""Cancel a payment."""
|
206
204
|
payment = self.get_object()
|
207
|
-
|
205
|
+
|
208
206
|
if payment.status not in ['pending', 'confirming']:
|
209
207
|
return Response(
|
210
208
|
{'error': 'Payment cannot be cancelled in current status'},
|
211
209
|
status=status.HTTP_400_BAD_REQUEST
|
212
210
|
)
|
213
|
-
|
211
|
+
|
214
212
|
payment.status = UniversalPayment.PaymentStatus.CANCELLED
|
215
213
|
payment.save()
|
216
|
-
|
214
|
+
|
217
215
|
logger.info(f"Payment {payment.id} cancelled by admin {request.user.id}")
|
218
|
-
|
216
|
+
|
219
217
|
serializer = self.get_serializer(payment)
|
220
218
|
return Response(serializer.data)
|
221
|
-
|
219
|
+
|
222
220
|
@action(detail=True, methods=['post'])
|
223
221
|
def refund(self, request, pk=None):
|
224
222
|
"""Refund a payment."""
|
225
223
|
payment = self.get_object()
|
226
|
-
|
224
|
+
|
227
225
|
if payment.status != 'completed':
|
228
226
|
return Response(
|
229
227
|
{'error': 'Only completed payments can be refunded'},
|
230
228
|
status=status.HTTP_400_BAD_REQUEST
|
231
229
|
)
|
232
|
-
|
230
|
+
|
233
231
|
payment.status = UniversalPayment.PaymentStatus.REFUNDED
|
234
232
|
payment.save()
|
235
|
-
|
233
|
+
|
236
234
|
logger.info(f"Payment {payment.id} refunded by admin {request.user.id}")
|
237
|
-
|
235
|
+
|
238
236
|
serializer = self.get_serializer(payment)
|
239
237
|
return Response(serializer.data)
|
240
|
-
|
238
|
+
|
241
239
|
@action(detail=True, methods=['post'])
|
242
240
|
def refresh_status(self, request, pk=None):
|
243
241
|
"""Refresh payment status from provider via AJAX."""
|
244
242
|
payment = self.get_object()
|
245
|
-
|
243
|
+
|
246
244
|
try:
|
247
245
|
# Import here to avoid circular imports
|
248
246
|
from django_cfg.apps.payments.services.core.payment_service import PaymentService
|
249
|
-
|
247
|
+
|
250
248
|
# Create PaymentStatusRequest
|
251
249
|
from django_cfg.apps.payments.services.types import PaymentStatusRequest
|
252
|
-
|
250
|
+
|
253
251
|
status_request = PaymentStatusRequest(
|
254
252
|
payment_id=str(payment.id),
|
255
253
|
force_provider_check=True
|
256
254
|
)
|
257
|
-
|
255
|
+
|
258
256
|
# Create service instance and force refresh from provider
|
259
257
|
payment_service = PaymentService()
|
260
258
|
result = payment_service.get_payment_status(status_request)
|
261
|
-
|
259
|
+
|
262
260
|
if result.success:
|
263
261
|
# Reload payment from database to get updated data
|
264
262
|
payment.refresh_from_db()
|
265
|
-
|
263
|
+
|
266
264
|
# Serialize updated payment data
|
267
265
|
serializer = self.get_serializer(payment)
|
268
|
-
|
266
|
+
|
269
267
|
return Response({
|
270
268
|
'success': True,
|
271
269
|
'message': 'Payment status refreshed successfully',
|
@@ -278,14 +276,14 @@ class AdminPaymentViewSet(AdminBaseViewSet):
|
|
278
276
|
'message': result.message or 'Failed to refresh payment status',
|
279
277
|
'error_details': result.data if result.data else None
|
280
278
|
}, status=status.HTTP_400_BAD_REQUEST)
|
281
|
-
|
279
|
+
|
282
280
|
except Exception as e:
|
283
281
|
logger.error(f"Error refreshing payment {payment.id} status", extra={
|
284
282
|
'payment_id': payment.id,
|
285
283
|
'error': str(e),
|
286
284
|
'admin_user': request.user.id
|
287
285
|
})
|
288
|
-
|
286
|
+
|
289
287
|
return Response({
|
290
288
|
'success': False,
|
291
289
|
'message': f'Error refreshing payment status: {str(e)}',
|
@@ -4,18 +4,21 @@ Admin Statistics ViewSets.
|
|
4
4
|
DRF ViewSets for comprehensive statistics in admin interface.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from rest_framework import viewsets, status
|
8
|
-
from rest_framework.decorators import action
|
9
|
-
from rest_framework.response import Response
|
10
|
-
from django.db.models import Count, Sum, Avg, Q
|
11
|
-
from django.utils import timezone
|
12
7
|
from datetime import timedelta
|
13
8
|
|
9
|
+
from django.db.models import Count, Q, Sum
|
10
|
+
from django.utils import timezone
|
11
|
+
from rest_framework.decorators import action
|
12
|
+
from rest_framework.response import Response
|
14
13
|
|
15
|
-
from django_cfg.
|
14
|
+
from django_cfg.apps.payments.admin_interface.serializers import (
|
15
|
+
AdminPaymentStatsSerializer,
|
16
|
+
WebhookStatsSerializer,
|
17
|
+
)
|
16
18
|
from django_cfg.apps.payments.models import UniversalPayment
|
19
|
+
from django_cfg.modules.django_logging import get_logger
|
20
|
+
|
17
21
|
from ..base import AdminReadOnlyViewSet
|
18
|
-
from django_cfg.apps.payments.admin_interface.serializers import AdminPaymentStatsSerializer, WebhookStatsSerializer
|
19
22
|
|
20
23
|
logger = get_logger("admin_stats_api")
|
21
24
|
|
@@ -26,17 +29,17 @@ class AdminStatsViewSet(AdminReadOnlyViewSet):
|
|
26
29
|
|
27
30
|
Provides aggregated statistics across all system components.
|
28
31
|
"""
|
29
|
-
|
32
|
+
|
30
33
|
# No model - this is for aggregated statistics
|
31
34
|
serializer_class = AdminPaymentStatsSerializer
|
32
|
-
|
35
|
+
|
33
36
|
def list(self, request):
|
34
37
|
"""Get overview statistics."""
|
35
38
|
now = timezone.now()
|
36
|
-
|
39
|
+
|
37
40
|
# Payment statistics
|
38
41
|
payments_queryset = UniversalPayment.objects.all()
|
39
|
-
|
42
|
+
|
40
43
|
payment_stats = {
|
41
44
|
'total_payments': payments_queryset.count(),
|
42
45
|
'total_amount_usd': payments_queryset.aggregate(Sum('amount_usd'))['amount_usd__sum'] or 0,
|
@@ -44,20 +47,20 @@ class AdminStatsViewSet(AdminReadOnlyViewSet):
|
|
44
47
|
'failed_payments': payments_queryset.filter(status='failed').count(),
|
45
48
|
'pending_payments': payments_queryset.filter(status__in=['pending', 'confirming']).count(),
|
46
49
|
}
|
47
|
-
|
50
|
+
|
48
51
|
# Calculate success rate
|
49
52
|
total = payment_stats['total_payments']
|
50
53
|
if total > 0:
|
51
54
|
payment_stats['success_rate'] = (payment_stats['successful_payments'] / total) * 100
|
52
55
|
else:
|
53
56
|
payment_stats['success_rate'] = 0
|
54
|
-
|
57
|
+
|
55
58
|
# Time-based payment stats
|
56
59
|
payment_stats['last_24h'] = {
|
57
60
|
'count': payments_queryset.filter(created_at__gte=now - timedelta(hours=24)).count(),
|
58
61
|
'amount': payments_queryset.filter(created_at__gte=now - timedelta(hours=24)).aggregate(Sum('amount_usd'))['amount_usd__sum'] or 0,
|
59
62
|
}
|
60
|
-
|
63
|
+
|
61
64
|
# Mock webhook statistics (replace with real data)
|
62
65
|
webhook_stats = {
|
63
66
|
'total_events': 156,
|
@@ -66,7 +69,7 @@ class AdminStatsViewSet(AdminReadOnlyViewSet):
|
|
66
69
|
'pending_events': 2,
|
67
70
|
'webhook_success_rate': 91.0,
|
68
71
|
}
|
69
|
-
|
72
|
+
|
70
73
|
# System health metrics
|
71
74
|
system_stats = {
|
72
75
|
'active_users_24h': 45, # Mock data
|
@@ -74,32 +77,32 @@ class AdminStatsViewSet(AdminReadOnlyViewSet):
|
|
74
77
|
'avg_response_time': 245.5, # Mock data
|
75
78
|
'uptime_percentage': 99.9, # Mock data
|
76
79
|
}
|
77
|
-
|
80
|
+
|
78
81
|
return Response({
|
79
82
|
'payments': payment_stats,
|
80
83
|
'webhooks': webhook_stats,
|
81
84
|
'system': system_stats,
|
82
85
|
'last_updated': now.isoformat(),
|
83
86
|
})
|
84
|
-
|
87
|
+
|
85
88
|
@action(detail=False, methods=['get'])
|
86
89
|
def payments(self, request):
|
87
90
|
"""Get detailed payment statistics."""
|
88
91
|
queryset = UniversalPayment.objects.all()
|
89
92
|
now = timezone.now()
|
90
|
-
|
93
|
+
|
91
94
|
# Basic stats
|
92
95
|
total_payments = queryset.count()
|
93
96
|
total_amount = queryset.aggregate(Sum('amount_usd'))['amount_usd__sum'] or 0
|
94
|
-
|
97
|
+
|
95
98
|
# Status breakdown
|
96
99
|
status_stats = queryset.values('status').annotate(count=Count('id'))
|
97
100
|
successful = sum(s['count'] for s in status_stats if s['status'] in ['completed', 'confirmed'])
|
98
101
|
failed = sum(s['count'] for s in status_stats if s['status'] == 'failed')
|
99
102
|
pending = sum(s['count'] for s in status_stats if s['status'] in ['pending', 'confirming'])
|
100
|
-
|
103
|
+
|
101
104
|
success_rate = (successful / total_payments * 100) if total_payments > 0 else 0
|
102
|
-
|
105
|
+
|
103
106
|
# Provider breakdown
|
104
107
|
provider_stats = {}
|
105
108
|
for provider_data in queryset.values('provider').annotate(
|
@@ -116,7 +119,7 @@ class AdminStatsViewSet(AdminReadOnlyViewSet):
|
|
116
119
|
'failed': provider_data['failed'],
|
117
120
|
'success_rate': (provider_data['successful'] / provider_data['count'] * 100) if provider_data['count'] > 0 else 0,
|
118
121
|
}
|
119
|
-
|
122
|
+
|
120
123
|
# Currency breakdown
|
121
124
|
currency_stats = {}
|
122
125
|
for currency_data in queryset.values('currency__code').annotate(
|
@@ -127,14 +130,14 @@ class AdminStatsViewSet(AdminReadOnlyViewSet):
|
|
127
130
|
'count': currency_data['count'],
|
128
131
|
'total_amount': currency_data['total_amount'] or 0,
|
129
132
|
}
|
130
|
-
|
133
|
+
|
131
134
|
# Time-based stats
|
132
135
|
time_ranges = {
|
133
136
|
'last_24h': now - timedelta(hours=24),
|
134
137
|
'last_7d': now - timedelta(days=7),
|
135
138
|
'last_30d': now - timedelta(days=30),
|
136
139
|
}
|
137
|
-
|
140
|
+
|
138
141
|
time_stats = {}
|
139
142
|
for period, start_date in time_ranges.items():
|
140
143
|
period_queryset = queryset.filter(created_at__gte=start_date)
|
@@ -144,7 +147,7 @@ class AdminStatsViewSet(AdminReadOnlyViewSet):
|
|
144
147
|
'successful': period_queryset.filter(status='completed').count(),
|
145
148
|
'failed': period_queryset.filter(status='failed').count(),
|
146
149
|
}
|
147
|
-
|
150
|
+
|
148
151
|
stats_data = {
|
149
152
|
'total_payments': total_payments,
|
150
153
|
'total_amount_usd': total_amount,
|
@@ -156,10 +159,10 @@ class AdminStatsViewSet(AdminReadOnlyViewSet):
|
|
156
159
|
'by_currency': currency_stats,
|
157
160
|
**time_stats,
|
158
161
|
}
|
159
|
-
|
162
|
+
|
160
163
|
serializer = AdminPaymentStatsSerializer(stats_data)
|
161
164
|
return Response(serializer.data)
|
162
|
-
|
165
|
+
|
163
166
|
@action(detail=False, methods=['get'])
|
164
167
|
def webhooks(self, request):
|
165
168
|
"""Get detailed webhook statistics."""
|
@@ -183,10 +186,10 @@ class AdminStatsViewSet(AdminReadOnlyViewSet):
|
|
183
186
|
'avg_response_time': 245.5,
|
184
187
|
'max_response_time': 3000,
|
185
188
|
}
|
186
|
-
|
189
|
+
|
187
190
|
serializer = WebhookStatsSerializer(stats_data)
|
188
191
|
return Response(serializer.data)
|
189
|
-
|
192
|
+
|
190
193
|
@action(detail=False, methods=['get'])
|
191
194
|
def system(self, request):
|
192
195
|
"""Get system health and performance statistics."""
|
@@ -202,5 +205,5 @@ class AdminStatsViewSet(AdminReadOnlyViewSet):
|
|
202
205
|
'cpu_usage': '23%',
|
203
206
|
'disk_usage': '45%',
|
204
207
|
}
|
205
|
-
|
208
|
+
|
206
209
|
return Response(system_data)
|
@@ -4,15 +4,14 @@ Admin User ViewSet.
|
|
4
4
|
Simple ViewSet for user management in admin interface.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from rest_framework import viewsets
|
8
|
-
from rest_framework.permissions import IsAdminUser
|
9
|
-
from rest_framework.response import Response
|
10
7
|
from django.contrib.auth import get_user_model
|
11
8
|
from django_filters.rest_framework import DjangoFilterBackend
|
12
|
-
from rest_framework.filters import
|
9
|
+
from rest_framework.filters import OrderingFilter, SearchFilter
|
10
|
+
from rest_framework.permissions import IsAdminUser
|
11
|
+
from rest_framework.response import Response
|
13
12
|
|
14
|
-
from django_cfg.apps.payments.admin_interface.views.base import AdminReadOnlyViewSet
|
15
13
|
from django_cfg.apps.payments.admin_interface.serializers import AdminUserSerializer
|
14
|
+
from django_cfg.apps.payments.admin_interface.views.base import AdminReadOnlyViewSet
|
16
15
|
from django_cfg.modules.django_logging import get_logger
|
17
16
|
|
18
17
|
logger = get_logger("admin_user_api")
|
@@ -26,30 +25,30 @@ class AdminUserViewSet(AdminReadOnlyViewSet):
|
|
26
25
|
|
27
26
|
Provides read-only access to users for admin interface.
|
28
27
|
"""
|
29
|
-
|
28
|
+
|
30
29
|
queryset = User.objects.filter(is_active=True).order_by('username')
|
31
30
|
serializer_class = AdminUserSerializer
|
32
31
|
permission_classes = [IsAdminUser]
|
33
|
-
|
32
|
+
|
34
33
|
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
|
35
34
|
filterset_fields = ['is_active', 'is_staff', 'is_superuser']
|
36
35
|
search_fields = ['username', 'email', 'first_name', 'last_name']
|
37
36
|
ordering_fields = ['username', 'email', 'date_joined']
|
38
37
|
ordering = ['username'] # Override base class ordering
|
39
|
-
|
38
|
+
|
40
39
|
def get_queryset(self):
|
41
40
|
"""Optimized queryset for admin interface."""
|
42
41
|
# Don't slice here - let DRF handle pagination and ordering first
|
43
42
|
return super().get_queryset()
|
44
|
-
|
43
|
+
|
45
44
|
def list(self, request, *args, **kwargs):
|
46
45
|
"""Override list to limit results for dropdown."""
|
47
46
|
# Get the filtered and ordered queryset from DRF
|
48
47
|
queryset = self.filter_queryset(self.get_queryset())
|
49
|
-
|
48
|
+
|
50
49
|
# Now apply limit after filtering/ordering
|
51
50
|
queryset = queryset[:100] # Limit to first 100 users
|
52
|
-
|
51
|
+
|
53
52
|
# Use DRF pagination if needed
|
54
53
|
page = self.paginate_queryset(queryset)
|
55
54
|
if page is not None:
|