django-cfg 1.4.21__py3-none-any.whl → 1.4.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -5,29 +5,30 @@ Handles incoming webhooks from payment providers with universal support.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import json
|
8
|
-
import
|
9
|
-
|
10
|
-
from django.http import
|
8
|
+
from typing import Any, Dict, Optional
|
9
|
+
|
10
|
+
from django.http import HttpRequest, JsonResponse
|
11
|
+
from django.utils import timezone
|
12
|
+
from django.utils.decorators import method_decorator
|
11
13
|
from django.views.decorators.csrf import csrf_exempt
|
12
14
|
from django.views.decorators.http import require_http_methods
|
13
|
-
from
|
14
|
-
from django.utils import timezone
|
15
|
+
from drf_spectacular.utils import OpenApiParameter, OpenApiTypes, extend_schema
|
15
16
|
from rest_framework import status
|
16
17
|
from rest_framework.decorators import api_view, permission_classes
|
17
18
|
from rest_framework.permissions import AllowAny
|
18
19
|
from rest_framework.response import Response
|
19
20
|
from rest_framework.views import APIView
|
20
|
-
|
21
|
+
|
22
|
+
from django_cfg.modules.django_logging import get_logger
|
21
23
|
|
22
24
|
from ...services.core.webhook_service import WebhookService
|
23
|
-
from ...services.types import
|
25
|
+
from ...services.types import WebhookProcessingResult, WebhookValidationRequest
|
24
26
|
from ..serializers.webhooks import (
|
25
|
-
|
27
|
+
SupportedProvidersSerializer,
|
26
28
|
WebhookHealthSerializer,
|
29
|
+
WebhookResponseSerializer,
|
27
30
|
WebhookStatsSerializer,
|
28
|
-
SupportedProvidersSerializer,
|
29
31
|
)
|
30
|
-
from django_cfg.modules.django_logging import get_logger
|
31
32
|
|
32
33
|
logger = get_logger("webhook_views")
|
33
34
|
|
@@ -47,7 +48,7 @@ class UniversalWebhookView(APIView):
|
|
47
48
|
|
48
49
|
permission_classes = [AllowAny] # Webhooks don't use standard auth
|
49
50
|
serializer_class = WebhookResponseSerializer # For OpenAPI schema generation
|
50
|
-
|
51
|
+
|
51
52
|
def __init__(self, **kwargs):
|
52
53
|
super().__init__(**kwargs)
|
53
54
|
self.webhook_service = WebhookService()
|
@@ -78,18 +79,18 @@ class UniversalWebhookView(APIView):
|
|
78
79
|
Returns:
|
79
80
|
JsonResponse: Processing result
|
80
81
|
"""
|
81
|
-
|
82
|
+
|
82
83
|
start_time = timezone.now()
|
83
84
|
request_id = self._generate_request_id()
|
84
|
-
|
85
|
-
logger.info(
|
85
|
+
|
86
|
+
logger.info("📥 Webhook received", extra={
|
86
87
|
'provider': provider,
|
87
88
|
'request_id': request_id,
|
88
89
|
'content_type': request.content_type,
|
89
90
|
'content_length': len(request.body) if request.body else 0,
|
90
91
|
'user_agent': request.META.get('HTTP_USER_AGENT', 'unknown')
|
91
92
|
})
|
92
|
-
|
93
|
+
|
93
94
|
try:
|
94
95
|
# Parse webhook payload
|
95
96
|
webhook_payload = self._parse_webhook_payload(request)
|
@@ -99,13 +100,13 @@ class UniversalWebhookView(APIView):
|
|
99
100
|
status.HTTP_400_BAD_REQUEST,
|
100
101
|
request_id
|
101
102
|
)
|
102
|
-
|
103
|
+
|
103
104
|
# Extract headers for signature validation
|
104
105
|
webhook_headers = self._extract_webhook_headers(request)
|
105
|
-
|
106
|
+
|
106
107
|
# Get signature from headers (provider-specific)
|
107
108
|
signature = self._extract_signature(provider, webhook_headers)
|
108
|
-
|
109
|
+
|
109
110
|
# Create validation request
|
110
111
|
validation_request = WebhookValidationRequest(
|
111
112
|
provider=provider,
|
@@ -115,14 +116,14 @@ class UniversalWebhookView(APIView):
|
|
115
116
|
timestamp=start_time.isoformat(),
|
116
117
|
request_id=request_id
|
117
118
|
)
|
118
|
-
|
119
|
+
|
119
120
|
# Process webhook
|
120
121
|
result = self.webhook_service.process_webhook(validation_request)
|
121
|
-
|
122
|
+
|
122
123
|
# Log processing result
|
123
124
|
processing_time = (timezone.now() - start_time).total_seconds()
|
124
|
-
|
125
|
-
logger.info(
|
125
|
+
|
126
|
+
logger.info("🔄 Webhook processed", extra={
|
126
127
|
'provider': provider,
|
127
128
|
'request_id': request_id,
|
128
129
|
'success': result.success,
|
@@ -130,7 +131,7 @@ class UniversalWebhookView(APIView):
|
|
130
131
|
'actions_taken': getattr(result, 'actions_taken', []),
|
131
132
|
'payment_id': getattr(result, 'payment_id', None)
|
132
133
|
})
|
133
|
-
|
134
|
+
|
134
135
|
# Return appropriate response
|
135
136
|
if result.success:
|
136
137
|
return self._success_response(result, request_id)
|
@@ -141,9 +142,9 @@ class UniversalWebhookView(APIView):
|
|
141
142
|
request_id,
|
142
143
|
result
|
143
144
|
)
|
144
|
-
|
145
|
+
|
145
146
|
except json.JSONDecodeError as e:
|
146
|
-
logger.warning(
|
147
|
+
logger.warning("Invalid JSON payload", extra={
|
147
148
|
'provider': provider,
|
148
149
|
'request_id': request_id,
|
149
150
|
'error': str(e)
|
@@ -153,9 +154,9 @@ class UniversalWebhookView(APIView):
|
|
153
154
|
status.HTTP_400_BAD_REQUEST,
|
154
155
|
request_id
|
155
156
|
)
|
156
|
-
|
157
|
+
|
157
158
|
except Exception as e:
|
158
|
-
logger.error(
|
159
|
+
logger.error("Webhook processing error", extra={
|
159
160
|
'provider': provider,
|
160
161
|
'request_id': request_id,
|
161
162
|
'error': str(e),
|
@@ -166,7 +167,7 @@ class UniversalWebhookView(APIView):
|
|
166
167
|
status.HTTP_500_INTERNAL_SERVER_ERROR,
|
167
168
|
request_id
|
168
169
|
)
|
169
|
-
|
170
|
+
|
170
171
|
@extend_schema(
|
171
172
|
summary="Webhook Endpoint Info",
|
172
173
|
description="Get webhook endpoint information for debugging and configuration",
|
@@ -188,15 +189,15 @@ class UniversalWebhookView(APIView):
|
|
188
189
|
|
189
190
|
Useful for debugging and provider configuration verification.
|
190
191
|
"""
|
191
|
-
|
192
|
-
logger.info(
|
192
|
+
|
193
|
+
logger.info("📋 Webhook info requested", extra={
|
193
194
|
'provider': provider,
|
194
195
|
'ip': self._get_client_ip(request)
|
195
196
|
})
|
196
|
-
|
197
|
+
|
197
198
|
# Get webhook URL using ngrok integration
|
198
199
|
webhook_url = self._get_webhook_url(request, provider)
|
199
|
-
|
200
|
+
|
200
201
|
info = {
|
201
202
|
'provider': provider,
|
202
203
|
'webhook_url': webhook_url,
|
@@ -205,20 +206,20 @@ class UniversalWebhookView(APIView):
|
|
205
206
|
'timestamp': timezone.now().isoformat(),
|
206
207
|
'service_status': 'active'
|
207
208
|
}
|
208
|
-
|
209
|
+
|
209
210
|
return JsonResponse(info, status=status.HTTP_200_OK)
|
210
|
-
|
211
|
+
|
211
212
|
# ===== HELPER METHODS =====
|
212
|
-
|
213
|
+
|
213
214
|
def _parse_webhook_payload(self, request: HttpRequest) -> Optional[Dict[str, Any]]:
|
214
215
|
"""Parse webhook payload from request body."""
|
215
216
|
try:
|
216
217
|
if not request.body:
|
217
218
|
return None
|
218
|
-
|
219
|
+
|
219
220
|
# Handle different content types
|
220
221
|
content_type = request.content_type.lower()
|
221
|
-
|
222
|
+
|
222
223
|
if 'application/json' in content_type:
|
223
224
|
return json.loads(request.body.decode('utf-8'))
|
224
225
|
elif 'application/x-www-form-urlencoded' in content_type:
|
@@ -230,31 +231,31 @@ class UniversalWebhookView(APIView):
|
|
230
231
|
else:
|
231
232
|
# Try JSON as fallback
|
232
233
|
return json.loads(request.body.decode('utf-8'))
|
233
|
-
|
234
|
+
|
234
235
|
except (json.JSONDecodeError, UnicodeDecodeError) as e:
|
235
236
|
logger.warning(f"Failed to parse webhook payload: {e}")
|
236
237
|
return None
|
237
|
-
|
238
|
+
|
238
239
|
def _extract_webhook_headers(self, request: HttpRequest) -> Dict[str, str]:
|
239
240
|
"""Extract relevant headers for webhook validation."""
|
240
241
|
headers = {}
|
241
|
-
|
242
|
+
|
242
243
|
# Extract all HTTP headers
|
243
244
|
for key, value in request.META.items():
|
244
245
|
if key.startswith('HTTP_'):
|
245
246
|
# Convert HTTP_X_CUSTOM_HEADER to x-custom-header
|
246
247
|
header_name = key[5:].lower().replace('_', '-')
|
247
248
|
headers[header_name] = value
|
248
|
-
|
249
|
+
|
249
250
|
# Add some non-HTTP headers that might be useful
|
250
251
|
headers['content-type'] = request.content_type
|
251
252
|
headers['content-length'] = str(len(request.body)) if request.body else '0'
|
252
|
-
|
253
|
+
|
253
254
|
return headers
|
254
|
-
|
255
|
+
|
255
256
|
def _extract_signature(self, provider: str, headers: Dict[str, str]) -> Optional[str]:
|
256
257
|
"""Extract signature from headers based on provider."""
|
257
|
-
|
258
|
+
|
258
259
|
# Provider-specific signature header mapping
|
259
260
|
signature_headers = {
|
260
261
|
'nowpayments': 'x-nowpayments-sig',
|
@@ -262,52 +263,52 @@ class UniversalWebhookView(APIView):
|
|
262
263
|
'cryptapi': 'x-cryptapi-signature',
|
263
264
|
'cryptomus': 'sign',
|
264
265
|
}
|
265
|
-
|
266
|
+
|
266
267
|
signature_header = signature_headers.get(provider.lower())
|
267
268
|
if signature_header:
|
268
269
|
return headers.get(signature_header)
|
269
|
-
|
270
|
+
|
270
271
|
# Fallback: look for common signature headers
|
271
272
|
common_headers = ['signature', 'x-signature', 'authorization']
|
272
273
|
for header in common_headers:
|
273
274
|
if header in headers:
|
274
275
|
return headers[header]
|
275
|
-
|
276
|
+
|
276
277
|
return None
|
277
|
-
|
278
|
+
|
278
279
|
def _get_expected_headers(self, provider: str) -> Dict[str, str]:
|
279
280
|
"""Get expected headers for each provider."""
|
280
281
|
from ...services.integrations import get_webhook_provider_info, is_provider_supported
|
281
|
-
|
282
|
+
|
282
283
|
if not is_provider_supported(provider):
|
283
284
|
return {'content-type': 'application/json'}
|
284
|
-
|
285
|
+
|
285
286
|
provider_info = get_webhook_provider_info(provider)
|
286
287
|
return {
|
287
288
|
provider_info.signature_header: f'{provider_info.signature_algorithm} signature',
|
288
289
|
'content-type': provider_info.content_type
|
289
290
|
}
|
290
|
-
|
291
|
+
|
291
292
|
def _get_webhook_url(self, request: HttpRequest, provider: str) -> str:
|
292
293
|
"""Get webhook URL using ngrok integration."""
|
293
294
|
from ...services.integrations import get_webhook_url_for_provider
|
294
295
|
return get_webhook_url_for_provider(provider)
|
295
|
-
|
296
|
+
|
296
297
|
def _generate_request_id(self) -> str:
|
297
298
|
"""Generate unique request ID for tracking."""
|
298
299
|
import uuid
|
299
300
|
return str(uuid.uuid4())[:8]
|
300
|
-
|
301
|
+
|
301
302
|
def _get_client_ip(self, request: HttpRequest) -> str:
|
302
303
|
"""Get client IP address."""
|
303
304
|
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
|
304
305
|
if x_forwarded_for:
|
305
306
|
return x_forwarded_for.split(',')[0].strip()
|
306
307
|
return request.META.get('REMOTE_ADDR', 'unknown')
|
307
|
-
|
308
|
+
|
308
309
|
def _success_response(self, result: WebhookProcessingResult, request_id: str) -> JsonResponse:
|
309
310
|
"""Create success response."""
|
310
|
-
|
311
|
+
|
311
312
|
response_data = {
|
312
313
|
'success': True,
|
313
314
|
'message': 'Webhook processed successfully',
|
@@ -316,39 +317,39 @@ class UniversalWebhookView(APIView):
|
|
316
317
|
'processed': result.processed,
|
317
318
|
'timestamp': timezone.now().isoformat()
|
318
319
|
}
|
319
|
-
|
320
|
+
|
320
321
|
# Add optional fields if available
|
321
322
|
if hasattr(result, 'payment_id') and result.payment_id:
|
322
323
|
response_data['payment_id'] = result.payment_id
|
323
|
-
|
324
|
+
|
324
325
|
if hasattr(result, 'actions_taken') and result.actions_taken:
|
325
326
|
response_data['actions_taken'] = result.actions_taken
|
326
|
-
|
327
|
+
|
327
328
|
if hasattr(result, 'status_after') and result.status_after:
|
328
329
|
response_data['payment_status'] = result.status_after
|
329
|
-
|
330
|
+
|
330
331
|
return JsonResponse(response_data, status=status.HTTP_200_OK)
|
331
|
-
|
332
|
+
|
332
333
|
def _error_response(
|
333
|
-
self,
|
334
|
-
message: str,
|
335
|
-
status_code: int,
|
334
|
+
self,
|
335
|
+
message: str,
|
336
|
+
status_code: int,
|
336
337
|
request_id: str,
|
337
338
|
result: Optional[WebhookProcessingResult] = None
|
338
339
|
) -> JsonResponse:
|
339
340
|
"""Create error response."""
|
340
|
-
|
341
|
+
|
341
342
|
response_data = {
|
342
343
|
'success': False,
|
343
344
|
'error': message,
|
344
345
|
'request_id': request_id,
|
345
346
|
'timestamp': timezone.now().isoformat()
|
346
347
|
}
|
347
|
-
|
348
|
+
|
348
349
|
if result:
|
349
350
|
response_data['provider'] = result.provider
|
350
351
|
response_data['processed'] = getattr(result, 'processed', False)
|
351
|
-
|
352
|
+
|
352
353
|
return JsonResponse(response_data, status=status_code)
|
353
354
|
|
354
355
|
|
@@ -366,20 +367,20 @@ def webhook_health_check(request):
|
|
366
367
|
|
367
368
|
Returns service status and recent activity metrics.
|
368
369
|
"""
|
369
|
-
|
370
|
+
|
370
371
|
try:
|
371
|
-
from ...services.integrations import
|
372
|
-
|
372
|
+
from ...services.integrations import get_api_base_url, is_ngrok_available
|
373
|
+
|
373
374
|
webhook_service = WebhookService()
|
374
375
|
health_result = webhook_service.health_check()
|
375
|
-
|
376
|
+
|
376
377
|
# Add ngrok status
|
377
378
|
health_data = health_result.data if health_result.success else {}
|
378
379
|
health_data.update({
|
379
380
|
'ngrok_available': is_ngrok_available(),
|
380
381
|
'api_base_url': get_api_base_url(),
|
381
382
|
})
|
382
|
-
|
383
|
+
|
383
384
|
if health_result.success:
|
384
385
|
return Response({
|
385
386
|
'status': 'healthy',
|
@@ -395,7 +396,7 @@ def webhook_health_check(request):
|
|
395
396
|
'timestamp': timezone.now().isoformat(),
|
396
397
|
'details': health_data
|
397
398
|
}, status=status.HTTP_503_SERVICE_UNAVAILABLE)
|
398
|
-
|
399
|
+
|
399
400
|
except Exception as e:
|
400
401
|
logger.error(f"Webhook health check failed: {e}")
|
401
402
|
return Response({
|
@@ -430,15 +431,15 @@ def webhook_stats(request):
|
|
430
431
|
Query parameters:
|
431
432
|
- days: Number of days to analyze (default: 30)
|
432
433
|
"""
|
433
|
-
|
434
|
+
|
434
435
|
try:
|
435
436
|
days = int(request.GET.get('days', 30))
|
436
437
|
if days < 1 or days > 365:
|
437
438
|
days = 30
|
438
|
-
|
439
|
+
|
439
440
|
webhook_service = WebhookService()
|
440
441
|
stats_result = webhook_service.get_webhook_stats(days)
|
441
|
-
|
442
|
+
|
442
443
|
if stats_result.success:
|
443
444
|
return Response({
|
444
445
|
'success': True,
|
@@ -451,7 +452,7 @@ def webhook_stats(request):
|
|
451
452
|
'error': stats_result.message,
|
452
453
|
'timestamp': timezone.now().isoformat()
|
453
454
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
454
|
-
|
455
|
+
|
455
456
|
except ValueError:
|
456
457
|
return Response({
|
457
458
|
'success': False,
|
@@ -481,14 +482,14 @@ def supported_providers(request):
|
|
481
482
|
|
482
483
|
Returns provider information and webhook URLs.
|
483
484
|
"""
|
484
|
-
|
485
|
+
|
485
486
|
try:
|
486
|
-
from ...services.integrations import
|
487
|
-
|
487
|
+
from ...services.integrations import get_all_providers_info, get_all_webhook_urls
|
488
|
+
|
488
489
|
# Get all providers info dynamically
|
489
490
|
providers_info = get_all_providers_info()
|
490
491
|
webhook_urls = get_all_webhook_urls()
|
491
|
-
|
492
|
+
|
492
493
|
# Build provider list
|
493
494
|
providers_list = []
|
494
495
|
for provider_name, info in providers_info.items():
|
@@ -500,14 +501,14 @@ def supported_providers(request):
|
|
500
501
|
'webhook_url': webhook_urls.get(provider_name, f"http://localhost:8000/api/webhooks/{provider_name}/"),
|
501
502
|
'content_type': info['content_type']
|
502
503
|
})
|
503
|
-
|
504
|
+
|
504
505
|
return Response({
|
505
506
|
'success': True,
|
506
507
|
'providers': providers_list,
|
507
508
|
'total_count': len(providers_list),
|
508
509
|
'timestamp': timezone.now().isoformat()
|
509
510
|
}, status=status.HTTP_200_OK)
|
510
|
-
|
511
|
+
|
511
512
|
except Exception as e:
|
512
513
|
logger.error(f"Supported providers endpoint failed: {e}")
|
513
514
|
return Response({
|
@@ -527,9 +528,9 @@ def webhook_handler(request, provider: str):
|
|
527
528
|
|
528
529
|
Delegates to UniversalWebhookView for actual processing.
|
529
530
|
"""
|
530
|
-
|
531
|
+
|
531
532
|
view = UniversalWebhookView()
|
532
|
-
|
533
|
+
|
533
534
|
if request.method == 'POST':
|
534
535
|
return view.post(request, provider)
|
535
536
|
elif request.method == 'GET':
|
@@ -4,26 +4,26 @@
|
|
4
4
|
Overview dashboard for user payment metrics and analytics.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from .views import PaymentsDashboardViewSet
|
8
7
|
from .serializers import (
|
8
|
+
APIKeysOverviewSerializer,
|
9
|
+
BalanceOverviewSerializer,
|
10
|
+
PaymentsChartResponseSerializer,
|
9
11
|
PaymentsDashboardOverviewSerializer,
|
10
12
|
PaymentsMetricsSerializer,
|
11
|
-
BalanceOverviewSerializer,
|
12
13
|
SubscriptionOverviewSerializer,
|
13
|
-
APIKeysOverviewSerializer,
|
14
|
-
PaymentsChartResponseSerializer,
|
15
14
|
)
|
16
15
|
from .services import (
|
16
|
+
PaymentsAnalyticsService,
|
17
17
|
PaymentsDashboardMetricsService,
|
18
18
|
PaymentsUsageChartService,
|
19
19
|
RecentPaymentsService,
|
20
|
-
PaymentsAnalyticsService,
|
21
20
|
)
|
21
|
+
from .views import PaymentsDashboardViewSet
|
22
22
|
|
23
23
|
__all__ = [
|
24
24
|
# Views
|
25
25
|
'PaymentsDashboardViewSet',
|
26
|
-
|
26
|
+
|
27
27
|
# Serializers
|
28
28
|
'PaymentsDashboardOverviewSerializer',
|
29
29
|
'PaymentsMetricsSerializer',
|
@@ -31,7 +31,7 @@ __all__ = [
|
|
31
31
|
'SubscriptionOverviewSerializer',
|
32
32
|
'APIKeysOverviewSerializer',
|
33
33
|
'PaymentsChartResponseSerializer',
|
34
|
-
|
34
|
+
|
35
35
|
# Services
|
36
36
|
'PaymentsDashboardMetricsService',
|
37
37
|
'PaymentsUsageChartService',
|
@@ -3,9 +3,8 @@
|
|
3
3
|
|
4
4
|
DRF serializers for payments dashboard data with drf-spectacular integration.
|
5
5
|
"""
|
6
|
+
|
6
7
|
from rest_framework import serializers
|
7
|
-
from drf_spectacular.utils import extend_schema_field
|
8
|
-
from typing import Dict, Any
|
9
8
|
|
10
9
|
|
11
10
|
class BalanceOverviewSerializer(serializers.Serializer):
|
@@ -33,22 +32,22 @@ class SubscriptionOverviewSerializer(serializers.Serializer):
|
|
33
32
|
is_active = serializers.BooleanField(help_text="Whether subscription is active")
|
34
33
|
is_expired = serializers.BooleanField(help_text="Whether subscription is expired")
|
35
34
|
days_remaining = serializers.IntegerField(help_text="Days until expiration")
|
36
|
-
|
35
|
+
|
37
36
|
# Limits and usage
|
38
37
|
requests_per_hour = serializers.IntegerField(help_text="Hourly request limit")
|
39
38
|
requests_per_day = serializers.IntegerField(help_text="Daily request limit")
|
40
39
|
total_requests = serializers.IntegerField(help_text="Total requests made")
|
41
40
|
usage_percentage = serializers.FloatField(help_text="Usage percentage for current period")
|
42
|
-
|
41
|
+
|
43
42
|
# Billing
|
44
43
|
monthly_cost_usd = serializers.FloatField(help_text="Monthly cost in USD")
|
45
44
|
cost_display = serializers.CharField(help_text="Formatted cost display")
|
46
|
-
|
45
|
+
|
47
46
|
# Dates
|
48
47
|
starts_at = serializers.DateTimeField(help_text="Subscription start date")
|
49
48
|
expires_at = serializers.DateTimeField(help_text="Subscription expiration date")
|
50
49
|
last_request_at = serializers.DateTimeField(allow_null=True, help_text="Last API request timestamp")
|
51
|
-
|
50
|
+
|
52
51
|
# Access
|
53
52
|
endpoint_groups_count = serializers.IntegerField(help_text="Number of accessible endpoint groups")
|
54
53
|
endpoint_groups = serializers.ListField(
|
@@ -66,11 +65,11 @@ class APIKeysOverviewSerializer(serializers.Serializer):
|
|
66
65
|
expired_keys = serializers.IntegerField(help_text="Number of expired API keys")
|
67
66
|
total_requests = serializers.IntegerField(help_text="Total requests across all keys")
|
68
67
|
last_used_at = serializers.DateTimeField(allow_null=True, help_text="When any key was last used")
|
69
|
-
|
68
|
+
|
70
69
|
# Recent keys info
|
71
70
|
most_used_key_name = serializers.CharField(allow_null=True, help_text="Name of most used API key")
|
72
71
|
most_used_key_requests = serializers.IntegerField(help_text="Requests count for most used key")
|
73
|
-
|
72
|
+
|
74
73
|
# Expiring keys warning
|
75
74
|
expiring_soon_count = serializers.IntegerField(help_text="Number of keys expiring within 7 days")
|
76
75
|
|
@@ -83,20 +82,20 @@ class PaymentOverviewSerializer(serializers.Serializer):
|
|
83
82
|
completed_payments = serializers.IntegerField(help_text="Number of completed payments")
|
84
83
|
pending_payments = serializers.IntegerField(help_text="Number of pending payments")
|
85
84
|
failed_payments = serializers.IntegerField(help_text="Number of failed payments")
|
86
|
-
|
85
|
+
|
87
86
|
# Amounts
|
88
87
|
total_amount_usd = serializers.FloatField(help_text="Total payment amount in USD")
|
89
88
|
completed_amount_usd = serializers.FloatField(help_text="Total completed amount in USD")
|
90
89
|
average_payment_usd = serializers.FloatField(help_text="Average payment amount in USD")
|
91
|
-
|
90
|
+
|
92
91
|
# Success rate
|
93
92
|
success_rate = serializers.FloatField(help_text="Payment success rate percentage")
|
94
|
-
|
93
|
+
|
95
94
|
# Recent activity
|
96
95
|
last_payment_at = serializers.DateTimeField(allow_null=True, help_text="Last payment timestamp")
|
97
96
|
payments_this_month = serializers.IntegerField(help_text="Number of payments this month")
|
98
97
|
amount_this_month = serializers.FloatField(help_text="Total amount this month")
|
99
|
-
|
98
|
+
|
100
99
|
# Popular currencies
|
101
100
|
top_currency = serializers.CharField(allow_null=True, help_text="Most used currency")
|
102
101
|
top_currency_count = serializers.IntegerField(help_text="Usage count for top currency")
|
@@ -127,7 +126,7 @@ class RecentPaymentSerializer(serializers.Serializer):
|
|
127
126
|
provider = serializers.CharField(help_text="Payment provider")
|
128
127
|
created_at = serializers.DateTimeField(help_text="Payment creation timestamp")
|
129
128
|
completed_at = serializers.DateTimeField(allow_null=True, help_text="Payment completion timestamp")
|
130
|
-
|
129
|
+
|
131
130
|
# Status flags
|
132
131
|
is_pending = serializers.BooleanField(help_text="Whether payment is pending")
|
133
132
|
is_completed = serializers.BooleanField(help_text="Whether payment is completed")
|
@@ -146,7 +145,7 @@ class RecentTransactionSerializer(serializers.Serializer):
|
|
146
145
|
description = serializers.CharField(help_text="Transaction description")
|
147
146
|
created_at = serializers.DateTimeField(help_text="Transaction timestamp")
|
148
147
|
payment_id = serializers.CharField(allow_null=True, help_text="Related payment ID")
|
149
|
-
|
148
|
+
|
150
149
|
# Type info
|
151
150
|
is_credit = serializers.BooleanField(help_text="Whether this is a credit transaction")
|
152
151
|
is_debit = serializers.BooleanField(help_text="Whether this is a debit transaction")
|