django-cfg 1.4.21__py3-none-any.whl → 1.4.24__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 +36 -7
- 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.24.dist-info}/METADATA +1 -1
- django_cfg-1.4.24.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.24.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/licenses/LICENSE +0 -0
@@ -5,15 +5,17 @@ Minimal signals focused on cache invalidation and notifications.
|
|
5
5
|
Business logic stays in UserBalanceManager and TransactionManager.
|
6
6
|
"""
|
7
7
|
|
8
|
-
from
|
9
|
-
|
8
|
+
from decimal import Decimal
|
9
|
+
|
10
10
|
from django.core.cache import cache
|
11
|
+
from django.db.models.signals import post_delete, post_save, pre_save
|
12
|
+
from django.dispatch import receiver
|
11
13
|
from django.utils import timezone
|
12
|
-
from decimal import Decimal
|
13
14
|
|
14
|
-
from ..models import UserBalance, Transaction
|
15
15
|
from django_cfg.modules.django_logging import get_logger
|
16
16
|
|
17
|
+
from ..models import Transaction, UserBalance
|
18
|
+
|
17
19
|
logger = get_logger("balance_signals")
|
18
20
|
|
19
21
|
|
@@ -39,7 +41,7 @@ def handle_balance_change(sender, instance: UserBalance, created: bool, **kwargs
|
|
39
41
|
Business logic (analytics, calculations) stays in managers.
|
40
42
|
"""
|
41
43
|
if created:
|
42
|
-
logger.info(
|
44
|
+
logger.info("New balance created", extra={
|
43
45
|
'user_id': instance.user.id,
|
44
46
|
'initial_balance': instance.balance_usd
|
45
47
|
})
|
@@ -49,25 +51,25 @@ def handle_balance_change(sender, instance: UserBalance, created: bool, **kwargs
|
|
49
51
|
# Ensure both values are Decimal for consistent arithmetic
|
50
52
|
old_balance = Decimal(str(instance._original_balance or 0.0))
|
51
53
|
new_balance = Decimal(str(instance.balance_usd))
|
52
|
-
|
54
|
+
|
53
55
|
if old_balance != new_balance:
|
54
56
|
balance_change = new_balance - old_balance
|
55
|
-
|
56
|
-
logger.info(
|
57
|
+
|
58
|
+
logger.info("Balance changed", extra={
|
57
59
|
'user_id': instance.user.id,
|
58
60
|
'old_balance': old_balance,
|
59
61
|
'new_balance': new_balance,
|
60
62
|
'change_amount': balance_change
|
61
63
|
})
|
62
|
-
|
64
|
+
|
63
65
|
# Check for low balance warning (notification only)
|
64
66
|
if new_balance < 10.0 and old_balance >= 10.0:
|
65
67
|
_trigger_low_balance_warning(instance)
|
66
|
-
|
68
|
+
|
67
69
|
# Check for zero balance (notification only)
|
68
70
|
if new_balance <= 0.0 and old_balance > 0.0:
|
69
71
|
_handle_zero_balance(instance)
|
70
|
-
|
72
|
+
|
71
73
|
# Clear balance-related caches
|
72
74
|
_clear_balance_caches(instance.user.id)
|
73
75
|
|
@@ -80,14 +82,14 @@ def handle_transaction_creation(sender, instance: Transaction, created: bool, **
|
|
80
82
|
Business logic (analytics, balance updates) stays in managers.
|
81
83
|
"""
|
82
84
|
if created:
|
83
|
-
logger.info(
|
85
|
+
logger.info("New transaction created", extra={
|
84
86
|
'transaction_id': str(instance.id),
|
85
87
|
'user_id': instance.user.id,
|
86
88
|
'transaction_type': instance.transaction_type,
|
87
89
|
'amount': instance.amount_usd,
|
88
90
|
'payment_id': str(instance.payment_id) if instance.payment_id else None
|
89
91
|
})
|
90
|
-
|
92
|
+
|
91
93
|
# Clear related caches
|
92
94
|
_clear_balance_caches(instance.user.id)
|
93
95
|
|
@@ -95,14 +97,14 @@ def handle_transaction_creation(sender, instance: Transaction, created: bool, **
|
|
95
97
|
@receiver(post_delete, sender=Transaction)
|
96
98
|
def handle_transaction_deletion(sender, instance: Transaction, **kwargs):
|
97
99
|
"""Handle transaction deletion (should be rare)."""
|
98
|
-
logger.warning(
|
100
|
+
logger.warning("Transaction deleted", extra={
|
99
101
|
'transaction_id': str(instance.id),
|
100
102
|
'user_id': instance.user.id,
|
101
103
|
'transaction_type': instance.transaction_type,
|
102
104
|
'amount': instance.amount,
|
103
105
|
'deletion_timestamp': timezone.now().isoformat()
|
104
106
|
})
|
105
|
-
|
107
|
+
|
106
108
|
# Clear caches
|
107
109
|
_clear_balance_caches(instance.user.id)
|
108
110
|
|
@@ -112,12 +114,12 @@ def handle_transaction_deletion(sender, instance: Transaction, **kwargs):
|
|
112
114
|
def _trigger_low_balance_warning(balance: UserBalance):
|
113
115
|
"""Trigger low balance warning for user (notification only)."""
|
114
116
|
try:
|
115
|
-
logger.warning(
|
117
|
+
logger.warning("Low balance warning", extra={
|
116
118
|
'user_id': balance.user.id,
|
117
119
|
'current_balance': balance.balance_usd,
|
118
120
|
'threshold': 10.0
|
119
121
|
})
|
120
|
-
|
122
|
+
|
121
123
|
# Set warning flag in cache for frontend
|
122
124
|
cache.set(
|
123
125
|
f"low_balance_warning:{balance.user.id}",
|
@@ -128,7 +130,7 @@ def _trigger_low_balance_warning(balance: UserBalance):
|
|
128
130
|
},
|
129
131
|
timeout=86400 # 24 hours
|
130
132
|
)
|
131
|
-
|
133
|
+
|
132
134
|
except Exception as e:
|
133
135
|
logger.error(f"Failed to trigger low balance warning: {e}")
|
134
136
|
|
@@ -136,11 +138,11 @@ def _trigger_low_balance_warning(balance: UserBalance):
|
|
136
138
|
def _handle_zero_balance(balance: UserBalance):
|
137
139
|
"""Handle zero balance situation (notification only)."""
|
138
140
|
try:
|
139
|
-
logger.warning(
|
141
|
+
logger.warning("Zero balance reached", extra={
|
140
142
|
'user_id': balance.user.id,
|
141
143
|
'previous_balance': getattr(balance, '_original_balance', 'unknown')
|
142
144
|
})
|
143
|
-
|
145
|
+
|
144
146
|
# Set zero balance flag in cache
|
145
147
|
cache.set(
|
146
148
|
f"zero_balance:{balance.user.id}",
|
@@ -150,7 +152,7 @@ def _handle_zero_balance(balance: UserBalance):
|
|
150
152
|
},
|
151
153
|
timeout=86400 * 7 # 7 days
|
152
154
|
)
|
153
|
-
|
155
|
+
|
154
156
|
except Exception as e:
|
155
157
|
logger.error(f"Failed to handle zero balance: {e}")
|
156
158
|
|
@@ -165,13 +167,13 @@ def _clear_balance_caches(user_id: int):
|
|
165
167
|
f"balance_history:{user_id}",
|
166
168
|
f"transaction_stats:{user_id}",
|
167
169
|
]
|
168
|
-
|
170
|
+
|
169
171
|
cache.delete_many(cache_keys)
|
170
|
-
|
171
|
-
logger.debug(
|
172
|
+
|
173
|
+
logger.debug("Cleared balance caches", extra={
|
172
174
|
'user_id': user_id,
|
173
175
|
'cache_keys_cleared': len(cache_keys)
|
174
176
|
})
|
175
|
-
|
177
|
+
|
176
178
|
except Exception as e:
|
177
|
-
logger.warning(f"Failed to clear balance caches: {e}")
|
179
|
+
logger.warning(f"Failed to clear balance caches: {e}")
|
@@ -5,14 +5,15 @@ Minimal signals focused on cache invalidation and notifications.
|
|
5
5
|
Business logic stays in PaymentManager.
|
6
6
|
"""
|
7
7
|
|
8
|
+
from django.core.cache import cache
|
8
9
|
from django.db.models.signals import post_save, pre_save
|
9
10
|
from django.dispatch import receiver
|
10
|
-
from django.core.cache import cache
|
11
11
|
from django.utils import timezone
|
12
12
|
|
13
|
-
from ..models import UniversalPayment
|
14
13
|
from django_cfg.modules.django_logging import get_logger
|
15
14
|
|
15
|
+
from ..models import UniversalPayment
|
16
|
+
|
16
17
|
logger = get_logger("payment_signals")
|
17
18
|
|
18
19
|
|
@@ -28,16 +29,16 @@ def handle_status_changes(sender, instance: UniversalPayment, **kwargs):
|
|
28
29
|
try:
|
29
30
|
original = UniversalPayment.objects.get(pk=instance.pk)
|
30
31
|
instance._original_status = original.status
|
31
|
-
|
32
|
+
|
32
33
|
# Check if status has changed
|
33
34
|
if original.status != instance.status:
|
34
35
|
instance.status_changed_at = timezone.now()
|
35
|
-
|
36
|
+
|
36
37
|
# Set completed_at if status changed to completed
|
37
38
|
if instance.status == 'completed' and not instance.completed_at:
|
38
39
|
instance.completed_at = timezone.now()
|
39
|
-
|
40
|
-
logger.debug(
|
40
|
+
|
41
|
+
logger.debug("Status change detected in pre_save", extra={
|
41
42
|
'payment_id': str(instance.id),
|
42
43
|
'old_status': original.status,
|
43
44
|
'new_status': instance.status,
|
@@ -50,8 +51,8 @@ def handle_status_changes(sender, instance: UniversalPayment, **kwargs):
|
|
50
51
|
instance._original_status = None
|
51
52
|
if instance.status and not instance.status_changed_at:
|
52
53
|
instance.status_changed_at = timezone.now()
|
53
|
-
|
54
|
-
logger.debug(
|
54
|
+
|
55
|
+
logger.debug("New payment status set in pre_save", extra={
|
55
56
|
'payment_id': 'new',
|
56
57
|
'status': instance.status,
|
57
58
|
'status_changed_at': instance.status_changed_at.isoformat()
|
@@ -66,7 +67,7 @@ def handle_payment_changes(sender, instance: UniversalPayment, created: bool, **
|
|
66
67
|
Business logic (balance updates, etc.) handled by managers.
|
67
68
|
"""
|
68
69
|
if created:
|
69
|
-
logger.info(
|
70
|
+
logger.info("New payment created", extra={
|
70
71
|
'payment_id': str(instance.id),
|
71
72
|
'user_id': instance.user.id,
|
72
73
|
'amount_usd': instance.amount_usd,
|
@@ -78,23 +79,23 @@ def handle_payment_changes(sender, instance: UniversalPayment, created: bool, **
|
|
78
79
|
if hasattr(instance, '_original_status'):
|
79
80
|
old_status = instance._original_status
|
80
81
|
new_status = instance.status
|
81
|
-
|
82
|
+
|
82
83
|
if old_status != new_status:
|
83
|
-
logger.info(
|
84
|
+
logger.info("Payment status changed", extra={
|
84
85
|
'payment_id': str(instance.id),
|
85
86
|
'user_id': instance.user.id,
|
86
87
|
'old_status': old_status,
|
87
88
|
'new_status': new_status
|
88
89
|
})
|
89
|
-
|
90
|
+
|
90
91
|
# Handle completed payment
|
91
92
|
if new_status == 'completed' and old_status != 'completed':
|
92
93
|
_handle_payment_completed(instance)
|
93
|
-
|
94
|
+
|
94
95
|
# Handle failed payment
|
95
96
|
elif new_status in ['failed', 'expired', 'cancelled'] and old_status not in ['failed', 'expired', 'cancelled']:
|
96
97
|
_handle_payment_failed(instance)
|
97
|
-
|
98
|
+
|
98
99
|
# Clear payment-related caches
|
99
100
|
_clear_payment_caches(instance)
|
100
101
|
|
@@ -106,7 +107,7 @@ def _handle_payment_completed(payment: UniversalPayment):
|
|
106
107
|
try:
|
107
108
|
# Use manager method which has all the business logic
|
108
109
|
from ..models import UserBalance
|
109
|
-
|
110
|
+
|
110
111
|
transaction_record = UserBalance.objects.add_funds_to_user(
|
111
112
|
user=payment.user,
|
112
113
|
amount=payment.amount_usd,
|
@@ -114,20 +115,20 @@ def _handle_payment_completed(payment: UniversalPayment):
|
|
114
115
|
description=f"Payment completed: {payment.id}",
|
115
116
|
payment_id=payment.id
|
116
117
|
)
|
117
|
-
|
118
|
+
|
118
119
|
# Mark payment as processed
|
119
120
|
payment.completed_at = timezone.now()
|
120
121
|
payment.save(update_fields=['completed_at', 'updated_at'])
|
121
|
-
|
122
|
-
logger.info(
|
122
|
+
|
123
|
+
logger.info("Payment completed and processed", extra={
|
123
124
|
'payment_id': str(payment.id),
|
124
125
|
'user_id': payment.user.id,
|
125
126
|
'amount_usd': payment.amount_usd,
|
126
127
|
'transaction_id': str(transaction_record.id)
|
127
128
|
})
|
128
|
-
|
129
|
+
|
129
130
|
except Exception as e:
|
130
|
-
logger.error(
|
131
|
+
logger.error("Failed to process completed payment", extra={
|
131
132
|
'payment_id': str(payment.id),
|
132
133
|
'user_id': payment.user.id,
|
133
134
|
'error': str(e)
|
@@ -139,14 +140,14 @@ def _handle_payment_failed(payment: UniversalPayment):
|
|
139
140
|
Handle failed payment - just logging and notifications.
|
140
141
|
"""
|
141
142
|
try:
|
142
|
-
logger.warning(
|
143
|
+
logger.warning("Payment failed", extra={
|
143
144
|
'payment_id': str(payment.id),
|
144
145
|
'user_id': payment.user.id,
|
145
146
|
'amount_usd': payment.amount_usd,
|
146
147
|
'status': payment.status,
|
147
148
|
'provider': payment.provider
|
148
149
|
})
|
149
|
-
|
150
|
+
|
150
151
|
# Set failure notification in cache
|
151
152
|
cache.set(
|
152
153
|
f"payment_failed:{payment.user.id}:{payment.id}",
|
@@ -158,9 +159,9 @@ def _handle_payment_failed(payment: UniversalPayment):
|
|
158
159
|
},
|
159
160
|
timeout=86400 * 7 # 7 days
|
160
161
|
)
|
161
|
-
|
162
|
+
|
162
163
|
except Exception as e:
|
163
|
-
logger.error(
|
164
|
+
logger.error("Failed to handle payment failure", extra={
|
164
165
|
'payment_id': str(payment.id),
|
165
166
|
'error': str(e)
|
166
167
|
})
|
@@ -175,14 +176,14 @@ def _clear_payment_caches(payment: UniversalPayment):
|
|
175
176
|
f"payment_summary:{payment.user.id}",
|
176
177
|
f"provider_stats:{payment.provider}",
|
177
178
|
]
|
178
|
-
|
179
|
+
|
179
180
|
cache.delete_many(cache_keys)
|
180
|
-
|
181
|
-
logger.debug(
|
181
|
+
|
182
|
+
logger.debug("Cleared payment caches", extra={
|
182
183
|
'payment_id': str(payment.id),
|
183
184
|
'user_id': payment.user.id,
|
184
185
|
'cache_keys_cleared': len(cache_keys)
|
185
186
|
})
|
186
|
-
|
187
|
+
|
187
188
|
except Exception as e:
|
188
189
|
logger.warning(f"Failed to clear payment caches: {e}")
|
@@ -5,14 +5,15 @@ Minimal signals focused on cache invalidation and notifications.
|
|
5
5
|
Business logic stays in SubscriptionManager.
|
6
6
|
"""
|
7
7
|
|
8
|
-
from django.db.models.signals import post_save, post_delete, pre_save
|
9
|
-
from django.dispatch import receiver
|
10
8
|
from django.core.cache import cache
|
9
|
+
from django.db.models.signals import post_delete, post_save, pre_save
|
10
|
+
from django.dispatch import receiver
|
11
11
|
from django.utils import timezone
|
12
12
|
|
13
|
-
from ..models import Subscription
|
14
13
|
from django_cfg.modules.django_logging import get_logger
|
15
14
|
|
15
|
+
from ..models import Subscription
|
16
|
+
|
16
17
|
logger = get_logger("subscription_signals")
|
17
18
|
|
18
19
|
|
@@ -43,66 +44,66 @@ def handle_subscription_changes(sender, instance: Subscription, created: bool, *
|
|
43
44
|
Business logic (API key management, etc.) stays in managers.
|
44
45
|
"""
|
45
46
|
if created:
|
46
|
-
logger.info(
|
47
|
+
logger.info("New subscription created", extra={
|
47
48
|
'subscription_id': str(instance.id),
|
48
49
|
'user_id': instance.user.id,
|
49
50
|
'tier': instance.tier,
|
50
51
|
'status': instance.status
|
51
52
|
})
|
52
|
-
|
53
|
+
|
53
54
|
# Create default API key for new subscription (delegate to manager)
|
54
55
|
_create_default_api_key(instance)
|
55
|
-
|
56
|
+
|
56
57
|
else:
|
57
58
|
# Check for status changes
|
58
59
|
if hasattr(instance, '_original_status'):
|
59
60
|
old_status = instance._original_status
|
60
61
|
new_status = instance.status
|
61
|
-
|
62
|
+
|
62
63
|
if old_status != new_status:
|
63
|
-
logger.info(
|
64
|
+
logger.info("Subscription status changed", extra={
|
64
65
|
'subscription_id': str(instance.id),
|
65
66
|
'user_id': instance.user.id,
|
66
67
|
'old_status': old_status,
|
67
68
|
'new_status': new_status
|
68
69
|
})
|
69
|
-
|
70
|
+
|
70
71
|
# Handle activation
|
71
72
|
if new_status == 'active' and old_status != 'active':
|
72
73
|
_handle_subscription_activated(instance)
|
73
|
-
|
74
|
+
|
74
75
|
# Handle suspension/cancellation
|
75
76
|
elif new_status in ['suspended', 'cancelled'] and old_status not in ['suspended', 'cancelled']:
|
76
77
|
_handle_subscription_deactivated(instance)
|
77
|
-
|
78
|
+
|
78
79
|
# Check for tier changes
|
79
80
|
if hasattr(instance, '_original_tier'):
|
80
81
|
old_tier = instance._original_tier
|
81
82
|
new_tier = instance.tier
|
82
|
-
|
83
|
+
|
83
84
|
if old_tier != new_tier:
|
84
|
-
logger.info(
|
85
|
+
logger.info("Subscription tier changed", extra={
|
85
86
|
'subscription_id': str(instance.id),
|
86
87
|
'user_id': instance.user.id,
|
87
88
|
'old_tier': old_tier,
|
88
89
|
'new_tier': new_tier
|
89
90
|
})
|
90
|
-
|
91
|
+
|
91
92
|
_handle_tier_change(instance, old_tier, new_tier)
|
92
|
-
|
93
|
+
|
93
94
|
# Check for expiration changes
|
94
95
|
if hasattr(instance, '_original_expires_at'):
|
95
96
|
old_expires = instance._original_expires_at
|
96
97
|
new_expires = instance.expires_at
|
97
|
-
|
98
|
+
|
98
99
|
if old_expires != new_expires:
|
99
|
-
logger.info(
|
100
|
+
logger.info("Subscription expiration changed", extra={
|
100
101
|
'subscription_id': str(instance.id),
|
101
102
|
'user_id': instance.user.id,
|
102
103
|
'old_expires': old_expires.isoformat() if old_expires else None,
|
103
104
|
'new_expires': new_expires.isoformat() if new_expires else None
|
104
105
|
})
|
105
|
-
|
106
|
+
|
106
107
|
# Clear subscription-related caches
|
107
108
|
_clear_subscription_caches(instance)
|
108
109
|
|
@@ -110,14 +111,14 @@ def handle_subscription_changes(sender, instance: Subscription, created: bool, *
|
|
110
111
|
@receiver(post_delete, sender=Subscription)
|
111
112
|
def handle_subscription_deletion(sender, instance: Subscription, **kwargs):
|
112
113
|
"""Handle subscription deletion."""
|
113
|
-
logger.warning(
|
114
|
+
logger.warning("Subscription deleted", extra={
|
114
115
|
'subscription_id': str(instance.id),
|
115
116
|
'user_id': instance.user.id,
|
116
117
|
'tier': instance.tier,
|
117
118
|
'status': instance.status,
|
118
119
|
'deletion_timestamp': timezone.now().isoformat()
|
119
120
|
})
|
120
|
-
|
121
|
+
|
121
122
|
# Clear caches
|
122
123
|
_clear_subscription_caches(instance)
|
123
124
|
|
@@ -128,22 +129,22 @@ def _create_default_api_key(subscription: Subscription):
|
|
128
129
|
"""Create default API key for new subscription (delegate to manager)."""
|
129
130
|
try:
|
130
131
|
from ..models import APIKey
|
131
|
-
|
132
|
+
|
132
133
|
# Use manager method which has all the business logic
|
133
134
|
api_key = APIKey.objects.create_api_key_for_user(
|
134
135
|
user=subscription.user,
|
135
136
|
name=f"Default API Key ({subscription.tier})",
|
136
137
|
expires_in_days=None # No expiration for default key
|
137
138
|
)
|
138
|
-
|
139
|
-
logger.info(
|
139
|
+
|
140
|
+
logger.info("Created default API key for subscription", extra={
|
140
141
|
'subscription_id': str(subscription.id),
|
141
142
|
'user_id': subscription.user.id,
|
142
143
|
'api_key_id': str(api_key.id)
|
143
144
|
})
|
144
|
-
|
145
|
+
|
145
146
|
except Exception as e:
|
146
|
-
logger.error(
|
147
|
+
logger.error("Failed to create default API key", extra={
|
147
148
|
'subscription_id': str(subscription.id),
|
148
149
|
'user_id': subscription.user.id,
|
149
150
|
'error': str(e)
|
@@ -153,12 +154,12 @@ def _create_default_api_key(subscription: Subscription):
|
|
153
154
|
def _handle_subscription_activated(subscription: Subscription):
|
154
155
|
"""Handle subscription activation (notification only)."""
|
155
156
|
try:
|
156
|
-
logger.info(
|
157
|
+
logger.info("Subscription activated", extra={
|
157
158
|
'subscription_id': str(subscription.id),
|
158
159
|
'user_id': subscription.user.id,
|
159
160
|
'tier': subscription.tier
|
160
161
|
})
|
161
|
-
|
162
|
+
|
162
163
|
# Set activation notification in cache
|
163
164
|
cache.set(
|
164
165
|
f"subscription_activated:{subscription.user.id}",
|
@@ -169,7 +170,7 @@ def _handle_subscription_activated(subscription: Subscription):
|
|
169
170
|
},
|
170
171
|
timeout=86400 # 24 hours
|
171
172
|
)
|
172
|
-
|
173
|
+
|
173
174
|
except Exception as e:
|
174
175
|
logger.error(f"Failed to handle subscription activation: {e}")
|
175
176
|
|
@@ -177,13 +178,13 @@ def _handle_subscription_activated(subscription: Subscription):
|
|
177
178
|
def _handle_subscription_deactivated(subscription: Subscription):
|
178
179
|
"""Handle subscription deactivation (notification only)."""
|
179
180
|
try:
|
180
|
-
logger.warning(
|
181
|
+
logger.warning("Subscription deactivated", extra={
|
181
182
|
'subscription_id': str(subscription.id),
|
182
183
|
'user_id': subscription.user.id,
|
183
184
|
'status': subscription.status,
|
184
185
|
'tier': subscription.tier
|
185
186
|
})
|
186
|
-
|
187
|
+
|
187
188
|
# Set deactivation notification in cache
|
188
189
|
cache.set(
|
189
190
|
f"subscription_deactivated:{subscription.user.id}",
|
@@ -195,7 +196,7 @@ def _handle_subscription_deactivated(subscription: Subscription):
|
|
195
196
|
},
|
196
197
|
timeout=86400 * 7 # 7 days
|
197
198
|
)
|
198
|
-
|
199
|
+
|
199
200
|
except Exception as e:
|
200
201
|
logger.error(f"Failed to handle subscription deactivation: {e}")
|
201
202
|
|
@@ -203,13 +204,13 @@ def _handle_subscription_deactivated(subscription: Subscription):
|
|
203
204
|
def _handle_tier_change(subscription: Subscription, old_tier: str, new_tier: str):
|
204
205
|
"""Handle subscription tier change (notification only)."""
|
205
206
|
try:
|
206
|
-
logger.info(
|
207
|
+
logger.info("Subscription tier changed", extra={
|
207
208
|
'subscription_id': str(subscription.id),
|
208
209
|
'user_id': subscription.user.id,
|
209
210
|
'old_tier': old_tier,
|
210
211
|
'new_tier': new_tier
|
211
212
|
})
|
212
|
-
|
213
|
+
|
213
214
|
# Set tier change notification in cache
|
214
215
|
cache.set(
|
215
216
|
f"tier_changed:{subscription.user.id}",
|
@@ -221,7 +222,7 @@ def _handle_tier_change(subscription: Subscription, old_tier: str, new_tier: str
|
|
221
222
|
},
|
222
223
|
timeout=86400 # 24 hours
|
223
224
|
)
|
224
|
-
|
225
|
+
|
225
226
|
except Exception as e:
|
226
227
|
logger.error(f"Failed to handle tier change: {e}")
|
227
228
|
|
@@ -235,14 +236,14 @@ def _clear_subscription_caches(subscription: Subscription):
|
|
235
236
|
f"subscription_stats:{subscription.user.id}",
|
236
237
|
f"tier_limits:{subscription.tier}",
|
237
238
|
]
|
238
|
-
|
239
|
+
|
239
240
|
cache.delete_many(cache_keys)
|
240
|
-
|
241
|
-
logger.debug(
|
241
|
+
|
242
|
+
logger.debug("Cleared subscription caches", extra={
|
242
243
|
'subscription_id': str(subscription.id),
|
243
244
|
'user_id': subscription.user.id,
|
244
245
|
'cache_keys_cleared': len(cache_keys)
|
245
246
|
})
|
246
|
-
|
247
|
+
|
247
248
|
except Exception as e:
|
248
249
|
logger.warning(f"Failed to clear subscription caches: {e}")
|
@@ -16,15 +16,22 @@ function ngrokStatus() {
|
|
16
16
|
|
17
17
|
async init() {
|
18
18
|
await this.refreshStatus();
|
19
|
-
//
|
20
|
-
setInterval(() => this.refreshStatus(), 10000);
|
19
|
+
// Don't auto-refresh since endpoint doesn't exist
|
20
|
+
// setInterval(() => this.refreshStatus(), 10000);
|
21
21
|
},
|
22
22
|
|
23
23
|
async refreshStatus() {
|
24
24
|
this.loading = true;
|
25
25
|
try {
|
26
|
-
|
27
|
-
this.status = {
|
26
|
+
// Webhook health endpoint doesn't exist, so just show as inactive
|
27
|
+
this.status = {
|
28
|
+
active: false,
|
29
|
+
public_url: '',
|
30
|
+
webhook_url: '',
|
31
|
+
error: 'Ngrok tunnel not active. Run server with: python manage.py runserver_ngrok',
|
32
|
+
region: 'us',
|
33
|
+
proto: 'https'
|
34
|
+
};
|
28
35
|
} catch (error) {
|
29
36
|
console.error('Failed to fetch ngrok status:', error);
|
30
37
|
this.status.active = false;
|
@@ -34,8 +41,6 @@ function ngrokStatus() {
|
|
34
41
|
}
|
35
42
|
},
|
36
43
|
|
37
|
-
|
38
|
-
|
39
44
|
copyUrl() {
|
40
45
|
if (this.status.public_url) {
|
41
46
|
PaymentAPI.utils.copyToClipboard(this.status.public_url);
|
@@ -52,7 +57,6 @@ function ngrokStatus() {
|
|
52
57
|
if (this.status.public_url) {
|
53
58
|
window.open(this.status.public_url, '_blank');
|
54
59
|
}
|
55
|
-
}
|
56
|
-
|
60
|
+
}
|
57
61
|
};
|
58
62
|
}
|
@@ -162,6 +162,6 @@ function paymentDetail() {
|
|
162
162
|
// Auto-initialize if PaymentAPI is available
|
163
163
|
document.addEventListener('DOMContentLoaded', function() {
|
164
164
|
if (typeof PaymentAPI === 'undefined') {
|
165
|
-
console.warn('PaymentAPI not found. Make sure
|
165
|
+
console.warn('PaymentAPI not found. Make sure the generated MJS client is loaded in base.html');
|
166
166
|
}
|
167
167
|
});
|
@@ -86,8 +86,8 @@ function paymentForm() {
|
|
86
86
|
return;
|
87
87
|
}
|
88
88
|
|
89
|
-
// Use the
|
90
|
-
const response = await PaymentAPI.
|
89
|
+
// Use the PaymentAPI wrapper method
|
90
|
+
const response = await PaymentAPI.currencies.byProvider(this.form.provider);
|
91
91
|
console.log('📊 Provider currencies API response:', response);
|
92
92
|
|
93
93
|
// Extract currencies for the specific provider
|
@@ -224,7 +224,7 @@ function paymentForm() {
|
|
224
224
|
try {
|
225
225
|
const data = await PaymentAPI.admin.payments.create(this.form);
|
226
226
|
PaymentAPI.utils.showNotification('Payment created successfully!', 'success');
|
227
|
-
window.location.href = `/cfg/
|
227
|
+
window.location.href = `/cfg/payments/admin/payments/${data.id}/`;
|
228
228
|
} catch (error) {
|
229
229
|
console.error('Error:', error);
|
230
230
|
|