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
@@ -4,10 +4,11 @@ Response types for the Universal Payment System v2.0.
|
|
4
4
|
Pydantic models for service layer responses and results.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from decimal import Decimal
|
8
|
-
from typing import Optional, Dict, Any, List, Literal
|
9
|
-
from pydantic import BaseModel, Field, ConfigDict
|
10
7
|
from datetime import datetime
|
8
|
+
from decimal import Decimal
|
9
|
+
from typing import Any, Dict, List, Optional
|
10
|
+
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field
|
11
12
|
|
12
13
|
|
13
14
|
class ServiceOperationResult(BaseModel):
|
@@ -17,7 +18,7 @@ class ServiceOperationResult(BaseModel):
|
|
17
18
|
Provides consistent success/error handling across services.
|
18
19
|
"""
|
19
20
|
model_config = ConfigDict(validate_assignment=True)
|
20
|
-
|
21
|
+
|
21
22
|
success: bool = Field(description="Operation success status")
|
22
23
|
message: Optional[str] = Field(None, description="Human-readable message")
|
23
24
|
error_code: Optional[str] = Field(None, description="Machine-readable error code")
|
@@ -27,7 +28,7 @@ class ServiceOperationResult(BaseModel):
|
|
27
28
|
|
28
29
|
class PaymentResult(ServiceOperationResult):
|
29
30
|
"""Result of payment operations."""
|
30
|
-
|
31
|
+
|
31
32
|
payment_id: Optional[str] = Field(None, description="Payment ID")
|
32
33
|
status: Optional[str] = Field(None, description="Payment status")
|
33
34
|
amount_usd: Optional[float] = Field(None, description="Payment amount in USD")
|
@@ -43,7 +44,7 @@ class PaymentResult(ServiceOperationResult):
|
|
43
44
|
class ProviderResponse(BaseModel):
|
44
45
|
"""Response from payment provider."""
|
45
46
|
model_config = ConfigDict(validate_assignment=True)
|
46
|
-
|
47
|
+
|
47
48
|
provider: str = Field(description="Provider name")
|
48
49
|
success: bool = Field(description="Provider operation success")
|
49
50
|
provider_payment_id: Optional[str] = Field(None, description="Provider payment ID")
|
@@ -60,7 +61,7 @@ class ProviderResponse(BaseModel):
|
|
60
61
|
|
61
62
|
class BalanceResult(ServiceOperationResult):
|
62
63
|
"""Result of balance operations."""
|
63
|
-
|
64
|
+
|
64
65
|
user_id: Optional[int] = Field(None, description="User ID")
|
65
66
|
balance_usd: Optional[float] = Field(None, description="Current balance in USD")
|
66
67
|
transaction_id: Optional[str] = Field(None, description="Transaction ID")
|
@@ -70,7 +71,7 @@ class BalanceResult(ServiceOperationResult):
|
|
70
71
|
|
71
72
|
class SubscriptionResult(ServiceOperationResult):
|
72
73
|
"""Result of subscription operations."""
|
73
|
-
|
74
|
+
|
74
75
|
subscription_id: Optional[str] = Field(None, description="Subscription ID")
|
75
76
|
user_id: Optional[int] = Field(None, description="User ID")
|
76
77
|
tier: Optional[str] = Field(None, description="Subscription tier")
|
@@ -81,7 +82,7 @@ class SubscriptionResult(ServiceOperationResult):
|
|
81
82
|
|
82
83
|
class CurrencyConversionResult(ServiceOperationResult):
|
83
84
|
"""Result of currency conversion."""
|
84
|
-
|
85
|
+
|
85
86
|
amount: Optional[float] = Field(None, description="Original amount")
|
86
87
|
from_currency: Optional[str] = Field(None, description="Source currency")
|
87
88
|
to_currency: Optional[str] = Field(None, description="Target currency")
|
@@ -92,7 +93,7 @@ class CurrencyConversionResult(ServiceOperationResult):
|
|
92
93
|
|
93
94
|
class APIKeyResult(ServiceOperationResult):
|
94
95
|
"""Result of API key operations."""
|
95
|
-
|
96
|
+
|
96
97
|
api_key_id: Optional[str] = Field(None, description="API key ID")
|
97
98
|
key_value: Optional[str] = Field(None, description="API key value (only on creation)")
|
98
99
|
name: Optional[str] = Field(None, description="API key name")
|
@@ -103,7 +104,7 @@ class APIKeyResult(ServiceOperationResult):
|
|
103
104
|
|
104
105
|
class WebhookProcessingResult(ServiceOperationResult):
|
105
106
|
"""Result of webhook processing."""
|
106
|
-
|
107
|
+
|
107
108
|
webhook_id: Optional[str] = Field(None, description="Webhook ID")
|
108
109
|
provider: Optional[str] = Field(None, description="Provider name")
|
109
110
|
payment_id: Optional[str] = Field(None, description="Related payment ID")
|
@@ -113,7 +114,7 @@ class WebhookProcessingResult(ServiceOperationResult):
|
|
113
114
|
|
114
115
|
class ProviderHealthResult(ServiceOperationResult):
|
115
116
|
"""Result of provider health check."""
|
116
|
-
|
117
|
+
|
117
118
|
provider: str = Field(description="Provider name")
|
118
119
|
is_healthy: bool = Field(description="Provider health status")
|
119
120
|
response_time_ms: Optional[int] = Field(None, description="Response time in milliseconds")
|
@@ -126,7 +127,7 @@ class ProviderHealthResult(ServiceOperationResult):
|
|
126
127
|
class ServiceStats(BaseModel):
|
127
128
|
"""Service statistics."""
|
128
129
|
model_config = ConfigDict(validate_assignment=True)
|
129
|
-
|
130
|
+
|
130
131
|
service_name: str = Field(description="Service name")
|
131
132
|
total_operations: int = Field(default=0, description="Total operations")
|
132
133
|
successful_operations: int = Field(default=0, description="Successful operations")
|
@@ -139,7 +140,7 @@ class ServiceStats(BaseModel):
|
|
139
140
|
|
140
141
|
class BatchOperationResult(ServiceOperationResult):
|
141
142
|
"""Result of batch operations."""
|
142
|
-
|
143
|
+
|
143
144
|
total_items: int = Field(description="Total items processed")
|
144
145
|
successful_items: int = Field(description="Successfully processed items")
|
145
146
|
failed_items: int = Field(description="Failed items")
|
@@ -149,7 +150,7 @@ class BatchOperationResult(ServiceOperationResult):
|
|
149
150
|
|
150
151
|
class CacheOperationResult(ServiceOperationResult):
|
151
152
|
"""Result of cache operations."""
|
152
|
-
|
153
|
+
|
153
154
|
cache_key: Optional[str] = Field(None, description="Cache key")
|
154
155
|
cache_hit: Optional[bool] = Field(None, description="Whether cache was hit")
|
155
156
|
ttl_seconds: Optional[int] = Field(None, description="TTL in seconds")
|
@@ -4,16 +4,17 @@ Webhook types for the Universal Payment System v2.0.
|
|
4
4
|
Pydantic models for webhook validation and processing.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from decimal import Decimal
|
8
|
-
from typing import Optional, Dict, Any, Literal
|
9
|
-
from pydantic import BaseModel, Field, ConfigDict, field_validator
|
10
7
|
from datetime import datetime, timedelta
|
8
|
+
from decimal import Decimal
|
9
|
+
from typing import Any, Dict, Literal, Optional
|
10
|
+
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
11
12
|
|
12
13
|
|
13
14
|
class WebhookData(BaseModel):
|
14
15
|
"""Base webhook data structure."""
|
15
16
|
model_config = ConfigDict(validate_assignment=True, extra="forbid")
|
16
|
-
|
17
|
+
|
17
18
|
provider: str = Field(description="Provider name")
|
18
19
|
payment_id: str = Field(description="Payment ID")
|
19
20
|
status: str = Field(description="Payment status")
|
@@ -29,11 +30,11 @@ class NowPaymentsWebhook(BaseModel):
|
|
29
30
|
Based on NowPayments IPN (Instant Payment Notification) format.
|
30
31
|
"""
|
31
32
|
model_config = ConfigDict(validate_assignment=True, extra="allow")
|
32
|
-
|
33
|
+
|
33
34
|
# Required fields from NowPayments
|
34
35
|
payment_id: str = Field(description="NowPayments payment ID")
|
35
36
|
payment_status: Literal[
|
36
|
-
'waiting', 'confirming', 'confirmed', 'sending', 'partially_paid',
|
37
|
+
'waiting', 'confirming', 'confirmed', 'sending', 'partially_paid',
|
37
38
|
'finished', 'failed', 'refunded', 'expired'
|
38
39
|
] = Field(description="Payment status")
|
39
40
|
pay_address: str = Field(description="Payment address")
|
@@ -43,25 +44,25 @@ class NowPaymentsWebhook(BaseModel):
|
|
43
44
|
pay_currency: str = Field(description="Cryptocurrency code")
|
44
45
|
order_id: Optional[str] = Field(None, description="Order ID")
|
45
46
|
order_description: Optional[str] = Field(None, description="Order description")
|
46
|
-
|
47
|
+
|
47
48
|
# Optional fields
|
48
49
|
actually_paid: Optional[Decimal] = Field(None, description="Actually paid amount")
|
49
50
|
outcome_amount: Optional[Decimal] = Field(None, description="Outcome amount")
|
50
51
|
outcome_currency: Optional[str] = Field(None, description="Outcome currency")
|
51
|
-
|
52
|
+
|
52
53
|
# Network information
|
53
54
|
network: Optional[str] = Field(None, description="Blockchain network")
|
54
55
|
txn_id: Optional[str] = Field(None, description="Transaction ID")
|
55
|
-
|
56
|
+
|
56
57
|
# Timestamps
|
57
58
|
created_at: Optional[datetime] = Field(None, description="Creation timestamp")
|
58
59
|
updated_at: Optional[datetime] = Field(None, description="Update timestamp")
|
59
|
-
|
60
|
+
|
60
61
|
# Additional data
|
61
62
|
purchase_id: Optional[str] = Field(None, description="Purchase ID")
|
62
63
|
smart_contract: Optional[str] = Field(None, description="Smart contract address")
|
63
64
|
burning_percent: Optional[str] = Field(None, description="Burning percentage")
|
64
|
-
|
65
|
+
|
65
66
|
@field_validator('payment_status')
|
66
67
|
@classmethod
|
67
68
|
def validate_status(cls, v: str) -> str:
|
@@ -73,7 +74,7 @@ class NowPaymentsWebhook(BaseModel):
|
|
73
74
|
if v not in valid_statuses:
|
74
75
|
raise ValueError(f"Invalid payment status: {v}")
|
75
76
|
return v
|
76
|
-
|
77
|
+
|
77
78
|
@field_validator('price_currency')
|
78
79
|
@classmethod
|
79
80
|
def validate_price_currency(cls, v: str) -> str:
|
@@ -81,7 +82,7 @@ class NowPaymentsWebhook(BaseModel):
|
|
81
82
|
if v.upper() != 'USD':
|
82
83
|
raise ValueError("Price currency must be USD")
|
83
84
|
return v.upper()
|
84
|
-
|
85
|
+
|
85
86
|
def to_universal_status(self) -> str:
|
86
87
|
"""Convert NowPayments status to universal payment status."""
|
87
88
|
status_mapping = {
|
@@ -96,12 +97,12 @@ class NowPaymentsWebhook(BaseModel):
|
|
96
97
|
'expired': 'expired'
|
97
98
|
}
|
98
99
|
return status_mapping.get(self.payment_status, 'unknown')
|
99
|
-
|
100
|
+
|
100
101
|
def is_final_status(self) -> bool:
|
101
102
|
"""Check if payment status is final."""
|
102
103
|
final_statuses = ['finished', 'failed', 'refunded', 'expired']
|
103
104
|
return self.payment_status in final_statuses
|
104
|
-
|
105
|
+
|
105
106
|
def is_successful(self) -> bool:
|
106
107
|
"""Check if payment is successful."""
|
107
108
|
return self.payment_status == 'finished'
|
@@ -110,7 +111,7 @@ class NowPaymentsWebhook(BaseModel):
|
|
110
111
|
class WebhookProcessingResult(BaseModel):
|
111
112
|
"""Result of webhook processing."""
|
112
113
|
model_config = ConfigDict(validate_assignment=True)
|
113
|
-
|
114
|
+
|
114
115
|
success: bool = Field(description="Processing success")
|
115
116
|
webhook_id: Optional[str] = Field(None, description="Webhook ID")
|
116
117
|
payment_id: Optional[str] = Field(None, description="Related payment ID")
|
@@ -129,7 +130,7 @@ class WebhookProcessingResult(BaseModel):
|
|
129
130
|
class WebhookValidationResult(BaseModel):
|
130
131
|
"""Result of webhook validation."""
|
131
132
|
model_config = ConfigDict(validate_assignment=True)
|
132
|
-
|
133
|
+
|
133
134
|
is_valid: bool = Field(description="Validation result")
|
134
135
|
provider: str = Field(description="Provider name")
|
135
136
|
signature_valid: Optional[bool] = Field(None, description="Signature validation result")
|
@@ -141,18 +142,18 @@ class WebhookValidationResult(BaseModel):
|
|
141
142
|
class WebhookSignature(BaseModel):
|
142
143
|
"""Webhook signature validation data."""
|
143
144
|
model_config = ConfigDict(validate_assignment=True)
|
144
|
-
|
145
|
+
|
145
146
|
provider: str = Field(description="Provider name")
|
146
147
|
signature: str = Field(description="Webhook signature")
|
147
148
|
payload: str = Field(description="Raw payload string")
|
148
149
|
secret_key: str = Field(description="Secret key for validation")
|
149
150
|
algorithm: str = Field(default="sha512", description="Signature algorithm")
|
150
|
-
|
151
|
+
|
151
152
|
def validate_signature(self) -> bool:
|
152
153
|
"""Validate webhook signature."""
|
153
|
-
import hmac
|
154
154
|
import hashlib
|
155
|
-
|
155
|
+
import hmac
|
156
|
+
|
156
157
|
if self.algorithm == "sha512":
|
157
158
|
expected = hmac.new(
|
158
159
|
self.secret_key.encode('utf-8'),
|
@@ -167,41 +168,40 @@ class WebhookSignature(BaseModel):
|
|
167
168
|
).hexdigest()
|
168
169
|
else:
|
169
170
|
raise ValueError(f"Unsupported algorithm: {self.algorithm}")
|
170
|
-
|
171
|
+
|
171
172
|
return hmac.compare_digest(expected, self.signature)
|
172
173
|
|
173
174
|
|
174
175
|
class WebhookRetry(BaseModel):
|
175
176
|
"""Webhook retry configuration."""
|
176
177
|
model_config = ConfigDict(validate_assignment=True)
|
177
|
-
|
178
|
+
|
178
179
|
webhook_id: str = Field(description="Webhook ID")
|
179
180
|
attempt_number: int = Field(description="Retry attempt number")
|
180
181
|
max_attempts: int = Field(default=3, description="Maximum retry attempts")
|
181
182
|
delay_seconds: int = Field(default=60, description="Delay between retries")
|
182
183
|
last_error: Optional[str] = Field(None, description="Last error message")
|
183
184
|
next_retry_at: Optional[datetime] = Field(None, description="Next retry timestamp")
|
184
|
-
|
185
|
+
|
185
186
|
def should_retry(self) -> bool:
|
186
187
|
"""Check if webhook should be retried."""
|
187
188
|
return self.attempt_number < self.max_attempts
|
188
|
-
|
189
|
+
|
189
190
|
def calculate_next_retry(self) -> datetime:
|
190
191
|
"""Calculate next retry timestamp with exponential backoff."""
|
191
|
-
|
192
|
-
|
192
|
+
|
193
193
|
# Exponential backoff: delay * (2 ^ attempt_number)
|
194
194
|
delay = self.delay_seconds * (2 ** self.attempt_number)
|
195
195
|
# Cap at 1 hour
|
196
196
|
delay = min(delay, 3600)
|
197
|
-
|
197
|
+
|
198
198
|
return datetime.utcnow() + timedelta(seconds=delay)
|
199
199
|
|
200
200
|
|
201
201
|
class WebhookEvent(BaseModel):
|
202
202
|
"""Webhook event for logging and monitoring."""
|
203
203
|
model_config = ConfigDict(validate_assignment=True)
|
204
|
-
|
204
|
+
|
205
205
|
event_id: str = Field(description="Event ID")
|
206
206
|
webhook_id: str = Field(description="Webhook ID")
|
207
207
|
provider: str = Field(description="Provider name")
|
@@ -215,7 +215,7 @@ class WebhookEvent(BaseModel):
|
|
215
215
|
timestamp: datetime = Field(default_factory=datetime.utcnow, description="Event timestamp")
|
216
216
|
ip_address: Optional[str] = Field(None, description="Source IP address")
|
217
217
|
user_agent: Optional[str] = Field(None, description="User agent")
|
218
|
-
|
218
|
+
|
219
219
|
def to_log_entry(self) -> Dict[str, Any]:
|
220
220
|
"""Convert to structured log entry."""
|
221
221
|
return {
|
@@ -10,6 +10,7 @@ All business logic is in managers to avoid duplication.
|
|
10
10
|
"""
|
11
11
|
|
12
12
|
from django.apps import apps
|
13
|
+
|
13
14
|
from django_cfg.modules.django_logging import get_logger
|
14
15
|
|
15
16
|
logger = get_logger("payment_signals")
|
@@ -23,13 +24,10 @@ def register_signals():
|
|
23
24
|
"""
|
24
25
|
try:
|
25
26
|
# Import signal modules to register them
|
26
|
-
from . import payment_signals
|
27
|
-
|
28
|
-
from . import subscription_signals
|
29
|
-
from . import api_key_signals
|
30
|
-
|
27
|
+
from . import api_key_signals, balance_signals, payment_signals, subscription_signals
|
28
|
+
|
31
29
|
logger.info("Payment signals registered successfully")
|
32
|
-
|
30
|
+
|
33
31
|
except ImportError as e:
|
34
32
|
logger.error(f"Failed to register payment signals: {e}")
|
35
33
|
|
@@ -5,14 +5,15 @@ Minimal signals focused on cache invalidation and security notifications.
|
|
5
5
|
Business logic stays in APIKeyManager.
|
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 APIKey
|
14
13
|
from django_cfg.modules.django_logging import get_logger
|
15
14
|
|
15
|
+
from ..models import APIKey
|
16
|
+
|
16
17
|
logger = get_logger("api_key_signals")
|
17
18
|
|
18
19
|
|
@@ -40,13 +41,13 @@ def handle_api_key_changes(sender, instance: APIKey, created: bool, **kwargs):
|
|
40
41
|
Business logic (usage tracking, validation) stays in managers.
|
41
42
|
"""
|
42
43
|
if created:
|
43
|
-
logger.info(
|
44
|
+
logger.info("New API key created", extra={
|
44
45
|
'api_key_id': str(instance.id),
|
45
46
|
'user_id': instance.user.id,
|
46
47
|
'key_name': instance.name,
|
47
48
|
'expires_at': instance.expires_at.isoformat() if instance.expires_at else None
|
48
49
|
})
|
49
|
-
|
50
|
+
|
50
51
|
# Set creation notification in cache
|
51
52
|
cache.set(
|
52
53
|
f"api_key_created:{instance.user.id}:{instance.id}",
|
@@ -57,39 +58,39 @@ def handle_api_key_changes(sender, instance: APIKey, created: bool, **kwargs):
|
|
57
58
|
},
|
58
59
|
timeout=86400 # 24 hours
|
59
60
|
)
|
60
|
-
|
61
|
+
|
61
62
|
else:
|
62
63
|
# Check for status changes
|
63
64
|
if hasattr(instance, '_original_is_active'):
|
64
65
|
old_active = instance._original_is_active
|
65
66
|
new_active = instance.is_active
|
66
|
-
|
67
|
+
|
67
68
|
if old_active != new_active:
|
68
69
|
if new_active:
|
69
70
|
_handle_api_key_activated(instance)
|
70
71
|
else:
|
71
72
|
_handle_api_key_deactivated(instance)
|
72
|
-
|
73
|
+
|
73
74
|
# Check for usage increases (security monitoring)
|
74
75
|
if hasattr(instance, '_original_total_requests'):
|
75
76
|
old_requests = instance._original_total_requests or 0
|
76
77
|
new_requests = instance.total_requests
|
77
|
-
|
78
|
+
|
78
79
|
if new_requests > old_requests:
|
79
80
|
request_increase = new_requests - old_requests
|
80
|
-
|
81
|
+
|
81
82
|
# Log high usage increases (potential security concern)
|
82
83
|
if request_increase > 100: # More than 100 requests at once
|
83
|
-
logger.warning(
|
84
|
+
logger.warning("High API key usage increase", extra={
|
84
85
|
'api_key_id': str(instance.id),
|
85
86
|
'user_id': instance.user.id,
|
86
87
|
'old_requests': old_requests,
|
87
88
|
'new_requests': new_requests,
|
88
89
|
'increase': request_increase
|
89
90
|
})
|
90
|
-
|
91
|
+
|
91
92
|
_handle_high_usage_alert(instance, request_increase)
|
92
|
-
|
93
|
+
|
93
94
|
# Clear API key-related caches
|
94
95
|
_clear_api_key_caches(instance)
|
95
96
|
|
@@ -97,14 +98,14 @@ def handle_api_key_changes(sender, instance: APIKey, created: bool, **kwargs):
|
|
97
98
|
@receiver(post_delete, sender=APIKey)
|
98
99
|
def handle_api_key_deletion(sender, instance: APIKey, **kwargs):
|
99
100
|
"""Handle API key deletion."""
|
100
|
-
logger.warning(
|
101
|
+
logger.warning("API key deleted", extra={
|
101
102
|
'api_key_id': str(instance.id),
|
102
103
|
'user_id': instance.user.id,
|
103
104
|
'key_name': instance.name,
|
104
105
|
'total_requests': instance.total_requests,
|
105
106
|
'deletion_timestamp': timezone.now().isoformat()
|
106
107
|
})
|
107
|
-
|
108
|
+
|
108
109
|
# Set deletion notification in cache
|
109
110
|
cache.set(
|
110
111
|
f"api_key_deleted:{instance.user.id}:{instance.id}",
|
@@ -116,7 +117,7 @@ def handle_api_key_deletion(sender, instance: APIKey, **kwargs):
|
|
116
117
|
},
|
117
118
|
timeout=86400 * 30 # 30 days for audit
|
118
119
|
)
|
119
|
-
|
120
|
+
|
120
121
|
# Clear caches
|
121
122
|
_clear_api_key_caches(instance)
|
122
123
|
|
@@ -126,12 +127,12 @@ def handle_api_key_deletion(sender, instance: APIKey, **kwargs):
|
|
126
127
|
def _handle_api_key_activated(api_key: APIKey):
|
127
128
|
"""Handle API key activation (notification only)."""
|
128
129
|
try:
|
129
|
-
logger.info(
|
130
|
+
logger.info("API key activated", extra={
|
130
131
|
'api_key_id': str(api_key.id),
|
131
132
|
'user_id': api_key.user.id,
|
132
133
|
'key_name': api_key.name
|
133
134
|
})
|
134
|
-
|
135
|
+
|
135
136
|
# Set activation notification in cache
|
136
137
|
cache.set(
|
137
138
|
f"api_key_activated:{api_key.user.id}:{api_key.id}",
|
@@ -142,7 +143,7 @@ def _handle_api_key_activated(api_key: APIKey):
|
|
142
143
|
},
|
143
144
|
timeout=86400 # 24 hours
|
144
145
|
)
|
145
|
-
|
146
|
+
|
146
147
|
except Exception as e:
|
147
148
|
logger.error(f"Failed to handle API key activation: {e}")
|
148
149
|
|
@@ -150,13 +151,13 @@ def _handle_api_key_activated(api_key: APIKey):
|
|
150
151
|
def _handle_api_key_deactivated(api_key: APIKey):
|
151
152
|
"""Handle API key deactivation (security notification)."""
|
152
153
|
try:
|
153
|
-
logger.warning(
|
154
|
+
logger.warning("API key deactivated", extra={
|
154
155
|
'api_key_id': str(api_key.id),
|
155
156
|
'user_id': api_key.user.id,
|
156
157
|
'key_name': api_key.name,
|
157
158
|
'total_requests': api_key.total_requests
|
158
159
|
})
|
159
|
-
|
160
|
+
|
160
161
|
# Set deactivation notification in cache
|
161
162
|
cache.set(
|
162
163
|
f"api_key_deactivated:{api_key.user.id}:{api_key.id}",
|
@@ -168,7 +169,7 @@ def _handle_api_key_deactivated(api_key: APIKey):
|
|
168
169
|
},
|
169
170
|
timeout=86400 * 7 # 7 days
|
170
171
|
)
|
171
|
-
|
172
|
+
|
172
173
|
except Exception as e:
|
173
174
|
logger.error(f"Failed to handle API key deactivation: {e}")
|
174
175
|
|
@@ -176,13 +177,13 @@ def _handle_api_key_deactivated(api_key: APIKey):
|
|
176
177
|
def _handle_high_usage_alert(api_key: APIKey, request_increase: int):
|
177
178
|
"""Handle high usage alert (security monitoring)."""
|
178
179
|
try:
|
179
|
-
logger.warning(
|
180
|
+
logger.warning("High API key usage detected", extra={
|
180
181
|
'api_key_id': str(api_key.id),
|
181
182
|
'user_id': api_key.user.id,
|
182
183
|
'request_increase': request_increase,
|
183
184
|
'total_requests': api_key.total_requests
|
184
185
|
})
|
185
|
-
|
186
|
+
|
186
187
|
# Set high usage alert in cache
|
187
188
|
cache.set(
|
188
189
|
f"high_usage_alert:{api_key.user.id}:{api_key.id}",
|
@@ -194,15 +195,15 @@ def _handle_high_usage_alert(api_key: APIKey, request_increase: int):
|
|
194
195
|
},
|
195
196
|
timeout=86400 # 24 hours
|
196
197
|
)
|
197
|
-
|
198
|
+
|
198
199
|
# Check if we should temporarily disable the key (security measure)
|
199
200
|
if request_increase > 1000: # More than 1000 requests at once
|
200
|
-
logger.critical(
|
201
|
+
logger.critical("Extremely high API usage - potential abuse", extra={
|
201
202
|
'api_key_id': str(api_key.id),
|
202
203
|
'user_id': api_key.user.id,
|
203
204
|
'request_increase': request_increase
|
204
205
|
})
|
205
|
-
|
206
|
+
|
206
207
|
# Set critical alert flag
|
207
208
|
cache.set(
|
208
209
|
f"critical_usage_alert:{api_key.user.id}:{api_key.id}",
|
@@ -214,7 +215,7 @@ def _handle_high_usage_alert(api_key: APIKey, request_increase: int):
|
|
214
215
|
},
|
215
216
|
timeout=86400 * 7 # 7 days
|
216
217
|
)
|
217
|
-
|
218
|
+
|
218
219
|
except Exception as e:
|
219
220
|
logger.error(f"Failed to handle high usage alert: {e}")
|
220
221
|
|
@@ -228,14 +229,14 @@ def _clear_api_key_caches(api_key: APIKey):
|
|
228
229
|
f"api_key_stats:{api_key.user.id}",
|
229
230
|
f"api_key_usage:{api_key.id}",
|
230
231
|
]
|
231
|
-
|
232
|
+
|
232
233
|
cache.delete_many(cache_keys)
|
233
|
-
|
234
|
-
logger.debug(
|
234
|
+
|
235
|
+
logger.debug("Cleared API key caches", extra={
|
235
236
|
'api_key_id': str(api_key.id),
|
236
237
|
'user_id': api_key.user.id,
|
237
238
|
'cache_keys_cleared': len(cache_keys)
|
238
239
|
})
|
239
|
-
|
240
|
+
|
240
241
|
except Exception as e:
|
241
242
|
logger.warning(f"Failed to clear API key caches: {e}")
|