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
@@ -6,41 +6,38 @@ Business logic services with Pydantic validation and type safety.
|
|
6
6
|
|
7
7
|
# Core services
|
8
8
|
from .core import (
|
9
|
+
BalanceService,
|
9
10
|
BaseService,
|
11
|
+
CurrencyService,
|
10
12
|
PaymentService,
|
11
|
-
BalanceService,
|
12
13
|
SubscriptionService,
|
13
14
|
WebhookService,
|
14
|
-
CurrencyService,
|
15
15
|
)
|
16
16
|
|
17
17
|
# Service types
|
18
18
|
from .types import (
|
19
|
-
|
20
|
-
|
21
|
-
PaymentStatusRequest,
|
19
|
+
BalanceData,
|
20
|
+
BalanceResult,
|
22
21
|
BalanceUpdateRequest,
|
23
|
-
SubscriptionCreateRequest,
|
24
|
-
SubscriptionUpdateRequest,
|
25
22
|
CurrencyConversionRequest,
|
26
|
-
|
27
|
-
# Response types
|
28
|
-
PaymentResult,
|
29
|
-
BalanceResult,
|
30
|
-
SubscriptionResult,
|
31
23
|
CurrencyConversionResult,
|
32
|
-
|
33
|
-
|
24
|
+
CurrencyData,
|
25
|
+
NowPaymentsWebhook,
|
26
|
+
# Request types
|
27
|
+
PaymentCreateRequest,
|
34
28
|
# Data types
|
35
29
|
PaymentData,
|
36
|
-
|
30
|
+
# Response types
|
31
|
+
PaymentResult,
|
32
|
+
PaymentStatusRequest,
|
33
|
+
ServiceOperationResult,
|
34
|
+
SubscriptionCreateRequest,
|
37
35
|
SubscriptionData,
|
36
|
+
SubscriptionResult,
|
37
|
+
SubscriptionUpdateRequest,
|
38
38
|
TransactionData,
|
39
|
-
CurrencyData,
|
40
|
-
|
41
39
|
# Webhook types
|
42
40
|
WebhookData,
|
43
|
-
NowPaymentsWebhook,
|
44
41
|
WebhookProcessingResult,
|
45
42
|
)
|
46
43
|
|
@@ -52,7 +49,7 @@ __all__ = [
|
|
52
49
|
'SubscriptionService',
|
53
50
|
'WebhookService',
|
54
51
|
'CurrencyService',
|
55
|
-
|
52
|
+
|
56
53
|
# Request types
|
57
54
|
'PaymentCreateRequest',
|
58
55
|
'PaymentStatusRequest',
|
@@ -60,21 +57,21 @@ __all__ = [
|
|
60
57
|
'SubscriptionCreateRequest',
|
61
58
|
'SubscriptionUpdateRequest',
|
62
59
|
'CurrencyConversionRequest',
|
63
|
-
|
60
|
+
|
64
61
|
# Response types
|
65
62
|
'PaymentResult',
|
66
63
|
'BalanceResult',
|
67
64
|
'SubscriptionResult',
|
68
65
|
'CurrencyConversionResult',
|
69
66
|
'ServiceOperationResult',
|
70
|
-
|
67
|
+
|
71
68
|
# Data types
|
72
69
|
'PaymentData',
|
73
70
|
'BalanceData',
|
74
71
|
'SubscriptionData',
|
75
72
|
'TransactionData',
|
76
73
|
'CurrencyData',
|
77
|
-
|
74
|
+
|
78
75
|
# Webhook types
|
79
76
|
'WebhookData',
|
80
77
|
'NowPaymentsWebhook',
|
@@ -89,44 +86,44 @@ class ServiceRegistry:
|
|
89
86
|
|
90
87
|
Provides singleton access to services and health monitoring.
|
91
88
|
"""
|
92
|
-
|
89
|
+
|
93
90
|
_instances = {}
|
94
|
-
|
91
|
+
|
95
92
|
@classmethod
|
96
93
|
def get_payment_service(cls) -> PaymentService:
|
97
94
|
"""Get PaymentService instance."""
|
98
95
|
if 'payment' not in cls._instances:
|
99
96
|
cls._instances['payment'] = PaymentService()
|
100
97
|
return cls._instances['payment']
|
101
|
-
|
98
|
+
|
102
99
|
@classmethod
|
103
100
|
def get_balance_service(cls) -> BalanceService:
|
104
101
|
"""Get BalanceService instance."""
|
105
102
|
if 'balance' not in cls._instances:
|
106
103
|
cls._instances['balance'] = BalanceService()
|
107
104
|
return cls._instances['balance']
|
108
|
-
|
105
|
+
|
109
106
|
@classmethod
|
110
107
|
def get_subscription_service(cls) -> SubscriptionService:
|
111
108
|
"""Get SubscriptionService instance."""
|
112
109
|
if 'subscription' not in cls._instances:
|
113
110
|
cls._instances['subscription'] = SubscriptionService()
|
114
111
|
return cls._instances['subscription']
|
115
|
-
|
112
|
+
|
116
113
|
@classmethod
|
117
114
|
def get_webhook_service(cls) -> WebhookService:
|
118
115
|
"""Get WebhookService instance."""
|
119
116
|
if 'webhook' not in cls._instances:
|
120
117
|
cls._instances['webhook'] = WebhookService()
|
121
118
|
return cls._instances['webhook']
|
122
|
-
|
119
|
+
|
123
120
|
@classmethod
|
124
121
|
def get_currency_service(cls) -> CurrencyService:
|
125
122
|
"""Get CurrencyService instance."""
|
126
123
|
if 'currency' not in cls._instances:
|
127
124
|
cls._instances['currency'] = CurrencyService()
|
128
125
|
return cls._instances['currency']
|
129
|
-
|
126
|
+
|
130
127
|
@classmethod
|
131
128
|
def get_all_services(cls) -> dict:
|
132
129
|
"""Get all service instances."""
|
@@ -137,13 +134,13 @@ class ServiceRegistry:
|
|
137
134
|
'webhook': cls.get_webhook_service(),
|
138
135
|
'currency': cls.get_currency_service(),
|
139
136
|
}
|
140
|
-
|
137
|
+
|
141
138
|
@classmethod
|
142
139
|
def health_check_all(cls) -> dict:
|
143
140
|
"""Perform health check on all services."""
|
144
141
|
services = cls.get_all_services()
|
145
142
|
results = {}
|
146
|
-
|
143
|
+
|
147
144
|
for name, service in services.items():
|
148
145
|
try:
|
149
146
|
health_result = service.health_check()
|
@@ -158,22 +155,22 @@ class ServiceRegistry:
|
|
158
155
|
'message': f"Health check failed: {e}",
|
159
156
|
'data': {}
|
160
157
|
}
|
161
|
-
|
158
|
+
|
162
159
|
return results
|
163
|
-
|
160
|
+
|
164
161
|
@classmethod
|
165
162
|
def clear_cache_all(cls):
|
166
163
|
"""Clear cache for all services."""
|
167
164
|
for service in cls._instances.values():
|
168
165
|
if hasattr(service, '_cache_clear'):
|
169
166
|
service._cache_clear()
|
170
|
-
|
167
|
+
|
171
168
|
@classmethod
|
172
169
|
def get_stats_all(cls) -> dict:
|
173
170
|
"""Get statistics from all services."""
|
174
171
|
services = cls.get_all_services()
|
175
172
|
stats = {}
|
176
|
-
|
173
|
+
|
177
174
|
for name, service in services.items():
|
178
175
|
try:
|
179
176
|
service_stats = service.get_service_stats()
|
@@ -183,7 +180,7 @@ class ServiceRegistry:
|
|
183
180
|
'error': str(e),
|
184
181
|
'service_name': service.__class__.__name__
|
185
182
|
}
|
186
|
-
|
183
|
+
|
187
184
|
return stats
|
188
185
|
|
189
186
|
|
@@ -4,7 +4,13 @@ Cache services for the Universal Payment System v2.0.
|
|
4
4
|
Redis-backed caching with type safety and automatic key management.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from ..cache_service import
|
7
|
+
from ..cache_service import (
|
8
|
+
ApiKeyCache,
|
9
|
+
CacheService,
|
10
|
+
RateLimitCache,
|
11
|
+
SimpleCache,
|
12
|
+
get_cache_service,
|
13
|
+
)
|
8
14
|
|
9
15
|
__all__ = [
|
10
16
|
'CacheService',
|
@@ -6,15 +6,17 @@ Based on proven solutions from payments_old with improvements.
|
|
6
6
|
ONLY for API access control - NOT payment data!
|
7
7
|
"""
|
8
8
|
|
9
|
-
from typing import
|
9
|
+
from typing import Any, Dict
|
10
|
+
|
10
11
|
from django.core.cache import cache
|
12
|
+
|
11
13
|
from django_cfg.modules.django_logging import get_logger
|
12
14
|
|
13
|
-
from .interfaces import CacheInterface
|
14
|
-
from .simple_cache import SimpleCache
|
15
15
|
from .api_key_cache import ApiKeyCache
|
16
|
-
from .
|
16
|
+
from .interfaces import CacheInterface
|
17
17
|
from .keys import CacheKeys
|
18
|
+
from .rate_limit_cache import RateLimitCache
|
19
|
+
from .simple_cache import SimpleCache
|
18
20
|
|
19
21
|
logger = get_logger(__name__)
|
20
22
|
|
@@ -25,7 +27,7 @@ class CacheService:
|
|
25
27
|
|
26
28
|
Provides centralized access to different cache types.
|
27
29
|
"""
|
28
|
-
|
30
|
+
|
29
31
|
def __init__(self):
|
30
32
|
"""Initialize cache service with specialized caches."""
|
31
33
|
self.simple_cache = SimpleCache()
|
@@ -34,24 +36,24 @@ class CacheService:
|
|
34
36
|
# Backward compatibility attributes
|
35
37
|
self.default_timeout = 300
|
36
38
|
self.key_prefix = "payments"
|
37
|
-
|
39
|
+
|
38
40
|
# Backward compatibility methods - delegate to simple_cache
|
39
41
|
def get(self, key: str):
|
40
42
|
"""Get value from cache."""
|
41
43
|
return self.simple_cache.get(key)
|
42
|
-
|
44
|
+
|
43
45
|
def set(self, key: str, value, timeout=None):
|
44
46
|
"""Set value in cache."""
|
45
47
|
return self.simple_cache.set(key, value, timeout)
|
46
|
-
|
48
|
+
|
47
49
|
def delete(self, key: str):
|
48
50
|
"""Delete value from cache."""
|
49
51
|
return self.simple_cache.delete(key)
|
50
|
-
|
52
|
+
|
51
53
|
def exists(self, key: str):
|
52
54
|
"""Check if key exists in cache."""
|
53
55
|
return self.simple_cache.exists(key)
|
54
|
-
|
56
|
+
|
55
57
|
def get_or_set(self, key: str, default, timeout=None):
|
56
58
|
"""Get value or set default if not exists."""
|
57
59
|
value = self.get(key)
|
@@ -62,12 +64,12 @@ class CacheService:
|
|
62
64
|
value = default
|
63
65
|
self.set(key, value, timeout)
|
64
66
|
return value
|
65
|
-
|
67
|
+
|
66
68
|
def set_many(self, data: dict, timeout=None):
|
67
69
|
"""Set multiple values."""
|
68
70
|
for key, value in data.items():
|
69
71
|
self.set(key, value, timeout)
|
70
|
-
|
72
|
+
|
71
73
|
def get_many(self, keys: list):
|
72
74
|
"""Get multiple values."""
|
73
75
|
result = {}
|
@@ -76,33 +78,33 @@ class CacheService:
|
|
76
78
|
if value is not None:
|
77
79
|
result[key] = value
|
78
80
|
return result
|
79
|
-
|
81
|
+
|
80
82
|
def delete_many(self, keys: list):
|
81
83
|
"""Delete multiple values."""
|
82
84
|
for key in keys:
|
83
85
|
self.delete(key)
|
84
|
-
|
86
|
+
|
85
87
|
def clear(self):
|
86
88
|
"""Clear all cache (not implemented for safety)."""
|
87
|
-
# For safety, we don't implement cache.clear()
|
89
|
+
# For safety, we don't implement cache.clear()
|
88
90
|
# as it would clear the entire cache backend
|
89
91
|
# Instead, we clear Django's cache which is safe for tests
|
90
92
|
from django.core.cache import cache
|
91
93
|
cache.clear()
|
92
|
-
|
94
|
+
|
93
95
|
def health_check(self) -> Dict[str, Any]:
|
94
96
|
"""Check cache health."""
|
95
97
|
try:
|
96
98
|
test_key = "health_check"
|
97
99
|
test_value = "ok"
|
98
|
-
|
100
|
+
|
99
101
|
# Test set/get/delete
|
100
102
|
self.simple_cache.set(test_key, test_value, 10)
|
101
103
|
retrieved = self.simple_cache.get(test_key)
|
102
104
|
self.simple_cache.delete(test_key)
|
103
|
-
|
105
|
+
|
104
106
|
is_healthy = retrieved == test_value
|
105
|
-
|
107
|
+
|
106
108
|
return {
|
107
109
|
'healthy': is_healthy,
|
108
110
|
'backend': cache.__class__.__name__,
|
@@ -134,7 +136,7 @@ def get_cache_service() -> CacheService:
|
|
134
136
|
# Export main classes for backward compatibility
|
135
137
|
__all__ = [
|
136
138
|
'CacheService',
|
137
|
-
'CacheInterface',
|
139
|
+
'CacheInterface',
|
138
140
|
'SimpleCache',
|
139
141
|
'ApiKeyCache',
|
140
142
|
'RateLimitCache',
|
@@ -5,16 +5,17 @@ Specialized caching for API key operations and validation.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from typing import Optional
|
8
|
+
|
8
9
|
from .simple_cache import SimpleCache
|
9
10
|
|
10
11
|
|
11
12
|
class ApiKeyCache:
|
12
13
|
"""Specialized cache for API key operations."""
|
13
|
-
|
14
|
+
|
14
15
|
def __init__(self):
|
15
16
|
self.cache = SimpleCache("api_keys")
|
16
17
|
self.default_timeout = self._get_cache_timeout('api_key')
|
17
|
-
|
18
|
+
|
18
19
|
def _get_cache_timeout(self, cache_type: str) -> int:
|
19
20
|
"""Get cache timeout from PaymentsConfig."""
|
20
21
|
try:
|
@@ -23,15 +24,15 @@ class ApiKeyCache:
|
|
23
24
|
return config.cache_timeouts.get(cache_type, 300)
|
24
25
|
except Exception:
|
25
26
|
return 300 # 5 minutes default
|
26
|
-
|
27
|
+
|
27
28
|
def get_api_key_data(self, api_key: str) -> Optional[dict]:
|
28
29
|
"""Get cached API key data."""
|
29
30
|
return self.cache.get(f"key:{api_key}")
|
30
|
-
|
31
|
+
|
31
32
|
def cache_api_key_data(self, api_key: str, data: dict) -> bool:
|
32
33
|
"""Cache API key data."""
|
33
34
|
return self.cache.set(f"key:{api_key}", data, self.default_timeout)
|
34
|
-
|
35
|
+
|
35
36
|
def invalidate_api_key(self, api_key: str) -> bool:
|
36
37
|
"""Invalidate cached API key."""
|
37
38
|
return self.cache.delete(f"key:{api_key}")
|
@@ -5,27 +5,27 @@ Abstract interfaces for cache implementations.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from abc import ABC, abstractmethod
|
8
|
-
from typing import
|
8
|
+
from typing import Any, Optional
|
9
9
|
|
10
10
|
|
11
11
|
class CacheInterface(ABC):
|
12
12
|
"""Abstract cache interface."""
|
13
|
-
|
13
|
+
|
14
14
|
@abstractmethod
|
15
15
|
def get(self, key: str) -> Optional[Any]:
|
16
16
|
"""Get value from cache."""
|
17
17
|
pass
|
18
|
-
|
18
|
+
|
19
19
|
@abstractmethod
|
20
20
|
def set(self, key: str, value: Any, timeout: Optional[int] = None) -> bool:
|
21
21
|
"""Set value in cache."""
|
22
22
|
pass
|
23
|
-
|
23
|
+
|
24
24
|
@abstractmethod
|
25
25
|
def delete(self, key: str) -> bool:
|
26
26
|
"""Delete value from cache."""
|
27
27
|
pass
|
28
|
-
|
28
|
+
|
29
29
|
@abstractmethod
|
30
30
|
def exists(self, key: str) -> bool:
|
31
31
|
"""Check if key exists in cache."""
|
@@ -7,42 +7,42 @@ Centralized cache key generation for consistency and testing.
|
|
7
7
|
|
8
8
|
class CacheKeys:
|
9
9
|
"""Cache key generation utilities."""
|
10
|
-
|
10
|
+
|
11
11
|
@staticmethod
|
12
12
|
def user_balance(user_id: int) -> str:
|
13
13
|
"""Generate cache key for user balance."""
|
14
14
|
return f"payments:user_balance:{user_id}"
|
15
|
-
|
15
|
+
|
16
16
|
@staticmethod
|
17
17
|
def payment(payment_id: str) -> str:
|
18
18
|
"""Generate cache key for payment data."""
|
19
19
|
return f"payments:payment:{payment_id}"
|
20
|
-
|
20
|
+
|
21
21
|
@staticmethod
|
22
22
|
def payment_status(payment_id: str) -> str:
|
23
23
|
"""Generate cache key for payment status."""
|
24
24
|
return f"payments:payment_status:{payment_id}"
|
25
|
-
|
25
|
+
|
26
26
|
@staticmethod
|
27
27
|
def currency_rates(from_currency: str, to_currency: str) -> str:
|
28
28
|
"""Generate cache key for currency exchange rates."""
|
29
29
|
return f"payments:currency_rates:{from_currency}:{to_currency}"
|
30
|
-
|
30
|
+
|
31
31
|
@staticmethod
|
32
32
|
def provider_currencies(provider: str) -> str:
|
33
33
|
"""Generate cache key for provider supported currencies."""
|
34
34
|
return f"payments:provider_currencies:{provider}"
|
35
|
-
|
35
|
+
|
36
36
|
@staticmethod
|
37
37
|
def api_key_validation(api_key: str) -> str:
|
38
38
|
"""Generate cache key for API key validation data."""
|
39
39
|
return f"payments:api_key_validation:{api_key}"
|
40
|
-
|
40
|
+
|
41
41
|
@staticmethod
|
42
42
|
def user_subscription(user_id: int) -> str:
|
43
43
|
"""Generate cache key for user subscription data."""
|
44
44
|
return f"payments:user_subscription:{user_id}"
|
45
|
-
|
45
|
+
|
46
46
|
@staticmethod
|
47
47
|
def rate_limit(user_id: int, action: str) -> str:
|
48
48
|
"""Generate cache key for rate limiting."""
|
@@ -5,29 +5,30 @@ Specialized caching for API rate limiting and usage tracking.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from typing import Optional
|
8
|
+
|
8
9
|
from .simple_cache import SimpleCache
|
9
10
|
|
10
11
|
|
11
12
|
class RateLimitCache:
|
12
13
|
"""Specialized cache for rate limiting."""
|
13
|
-
|
14
|
+
|
14
15
|
def __init__(self):
|
15
16
|
self.cache = SimpleCache("rate_limit")
|
16
|
-
|
17
|
+
|
17
18
|
def get_usage_count(self, user_id: int, endpoint_group: str, window: str = "hour") -> int:
|
18
19
|
"""Get current usage count for rate limiting."""
|
19
20
|
key = f"usage:{user_id}:{endpoint_group}:{window}"
|
20
21
|
count = self.cache.get(key)
|
21
22
|
return count if count is not None else 0
|
22
|
-
|
23
|
+
|
23
24
|
def increment_usage(self, user_id: int, endpoint_group: str, window: str = "hour", ttl: Optional[int] = None) -> int:
|
24
25
|
"""Increment usage count and return new count."""
|
25
26
|
key = f"usage:{user_id}:{endpoint_group}:{window}"
|
26
|
-
|
27
|
+
|
27
28
|
# Get current count
|
28
29
|
current = self.get_usage_count(user_id, endpoint_group, window)
|
29
30
|
new_count = current + 1
|
30
|
-
|
31
|
+
|
31
32
|
# Get TTL from config or use defaults
|
32
33
|
if ttl is None:
|
33
34
|
try:
|
@@ -36,11 +37,11 @@ class RateLimitCache:
|
|
36
37
|
ttl = config.cache_timeouts.get('rate_limit', 3600)
|
37
38
|
except Exception:
|
38
39
|
ttl = 3600 if window == "hour" else 86400 # 1 hour or 1 day
|
39
|
-
|
40
|
+
|
40
41
|
# Set new count with TTL
|
41
42
|
self.cache.set(key, new_count, ttl)
|
42
43
|
return new_count
|
43
|
-
|
44
|
+
|
44
45
|
def reset_usage(self, user_id: int, endpoint_group: str, window: str = "hour") -> bool:
|
45
46
|
"""Reset usage count."""
|
46
47
|
key = f"usage:{user_id}:{endpoint_group}:{window}"
|
@@ -4,8 +4,10 @@ Simple cache implementation for the Universal Payment System v2.0.
|
|
4
4
|
Basic cache functionality with graceful fallback.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import
|
7
|
+
from typing import Any, Optional
|
8
|
+
|
8
9
|
from django.core.cache import cache
|
10
|
+
|
9
11
|
from django_cfg.modules.django_logging import get_logger
|
10
12
|
|
11
13
|
from .interfaces import CacheInterface
|
@@ -20,16 +22,17 @@ class SimpleCache(CacheInterface):
|
|
20
22
|
Falls back gracefully when cache is unavailable.
|
21
23
|
Based on proven solution from payments_old.
|
22
24
|
"""
|
23
|
-
|
25
|
+
|
24
26
|
def __init__(self, prefix: str = "payments"):
|
25
27
|
self.prefix = prefix
|
26
28
|
self.enabled = self._is_cache_enabled()
|
27
|
-
|
29
|
+
|
28
30
|
def _is_cache_enabled(self) -> bool:
|
29
31
|
"""Check if cache is enabled via PaymentsConfig."""
|
30
|
-
from django.conf import settings
|
31
|
-
import sys
|
32
32
|
import os
|
33
|
+
import sys
|
34
|
+
|
35
|
+
from django.conf import settings
|
33
36
|
|
34
37
|
# For tests, always enable cache (detect test environment)
|
35
38
|
# Check multiple ways to detect test environment
|
@@ -50,28 +53,28 @@ class SimpleCache(CacheInterface):
|
|
50
53
|
except Exception as e:
|
51
54
|
logger.debug(f"PaymentsConfig not available, enabling cache by default: {e}")
|
52
55
|
return True # Default to enabled with graceful fallback
|
53
|
-
|
56
|
+
|
54
57
|
def _make_key(self, key: str) -> str:
|
55
58
|
"""Create prefixed cache key."""
|
56
59
|
return f"{self.prefix}:{key}"
|
57
|
-
|
60
|
+
|
58
61
|
def get(self, key: str) -> Optional[Any]:
|
59
62
|
"""Get value from cache."""
|
60
63
|
if not self.enabled:
|
61
64
|
return None
|
62
|
-
|
65
|
+
|
63
66
|
try:
|
64
67
|
cache_key = self._make_key(key)
|
65
68
|
return cache.get(cache_key)
|
66
69
|
except Exception as e:
|
67
70
|
logger.warning(f"Cache get failed for key {key}: {e}")
|
68
71
|
return None
|
69
|
-
|
72
|
+
|
70
73
|
def set(self, key: str, value: Any, timeout: Optional[int] = None) -> bool:
|
71
74
|
"""Set value in cache."""
|
72
75
|
if not self.enabled:
|
73
76
|
return False
|
74
|
-
|
77
|
+
|
75
78
|
try:
|
76
79
|
cache_key = self._make_key(key)
|
77
80
|
cache.set(cache_key, value, timeout)
|
@@ -79,12 +82,12 @@ class SimpleCache(CacheInterface):
|
|
79
82
|
except Exception as e:
|
80
83
|
logger.warning(f"Cache set failed for key {key}: {e}")
|
81
84
|
return False
|
82
|
-
|
85
|
+
|
83
86
|
def delete(self, key: str) -> bool:
|
84
87
|
"""Delete value from cache."""
|
85
88
|
if not self.enabled:
|
86
89
|
return False
|
87
|
-
|
90
|
+
|
88
91
|
try:
|
89
92
|
cache_key = self._make_key(key)
|
90
93
|
cache.delete(cache_key)
|
@@ -92,12 +95,12 @@ class SimpleCache(CacheInterface):
|
|
92
95
|
except Exception as e:
|
93
96
|
logger.warning(f"Cache delete failed for key {key}: {e}")
|
94
97
|
return False
|
95
|
-
|
98
|
+
|
96
99
|
def exists(self, key: str) -> bool:
|
97
100
|
"""Check if key exists in cache."""
|
98
101
|
if not self.enabled:
|
99
102
|
return False
|
100
|
-
|
103
|
+
|
101
104
|
try:
|
102
105
|
cache_key = self._make_key(key)
|
103
106
|
return cache.get(cache_key) is not None
|
@@ -4,17 +4,17 @@ Core services for the Universal Payment System v2.0.
|
|
4
4
|
Business logic services with Pydantic validation.
|
5
5
|
"""
|
6
6
|
|
7
|
+
from .balance_service import BalanceService
|
7
8
|
from .base import BaseService
|
9
|
+
from .currency_service import CurrencyService
|
8
10
|
from .payment_service import PaymentService
|
9
|
-
from .balance_service import BalanceService
|
10
11
|
from .subscription_service import SubscriptionService
|
11
|
-
from .currency_service import CurrencyService
|
12
12
|
from .webhook_service import WebhookService
|
13
13
|
|
14
14
|
__all__ = [
|
15
15
|
'BaseService',
|
16
16
|
'PaymentService',
|
17
|
-
'BalanceService',
|
17
|
+
'BalanceService',
|
18
18
|
'SubscriptionService',
|
19
19
|
'CurrencyService',
|
20
20
|
'WebhookService',
|