django-cfg 1.4.21__py3-none-any.whl → 1.4.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -5,69 +5,68 @@ Django REST Framework serializers with Pydantic integration and service layer va
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
# Payment serializers
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
# API Key serializers
|
9
|
+
from .api_keys import (
|
10
|
+
APIKeyActionSerializer,
|
11
|
+
APIKeyCreateSerializer,
|
12
|
+
APIKeyDetailSerializer,
|
13
|
+
APIKeyListSerializer,
|
14
|
+
APIKeyStatsSerializer,
|
15
|
+
APIKeyUpdateSerializer,
|
16
|
+
APIKeyValidationSerializer,
|
13
17
|
)
|
14
18
|
|
15
19
|
# Balance serializers
|
16
20
|
from .balances import (
|
17
|
-
UserBalanceSerializer,
|
18
|
-
TransactionSerializer,
|
19
21
|
BalanceUpdateSerializer,
|
20
|
-
|
21
|
-
|
22
|
-
# Subscription serializers
|
23
|
-
from .subscriptions import (
|
24
|
-
SubscriptionSerializer,
|
25
|
-
SubscriptionCreateSerializer,
|
26
|
-
SubscriptionListSerializer,
|
27
|
-
SubscriptionUpdateSerializer,
|
28
|
-
SubscriptionUsageSerializer,
|
29
|
-
SubscriptionStatsSerializer,
|
30
|
-
EndpointGroupSerializer,
|
31
|
-
TariffSerializer,
|
22
|
+
TransactionSerializer,
|
23
|
+
UserBalanceSerializer,
|
32
24
|
)
|
33
25
|
|
34
26
|
# Currency serializers
|
35
27
|
from .currencies import (
|
28
|
+
CurrencyConversionSerializer,
|
36
29
|
CurrencySerializer,
|
37
30
|
NetworkSerializer,
|
38
31
|
ProviderCurrencySerializer,
|
39
|
-
|
32
|
+
)
|
33
|
+
from .payments import (
|
34
|
+
PaymentCreateSerializer,
|
35
|
+
PaymentListSerializer,
|
36
|
+
PaymentSerializer,
|
37
|
+
PaymentStatusSerializer,
|
40
38
|
)
|
41
39
|
|
42
|
-
#
|
43
|
-
from .
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
40
|
+
# Subscription serializers
|
41
|
+
from .subscriptions import (
|
42
|
+
EndpointGroupSerializer,
|
43
|
+
SubscriptionCreateSerializer,
|
44
|
+
SubscriptionListSerializer,
|
45
|
+
SubscriptionSerializer,
|
46
|
+
SubscriptionStatsSerializer,
|
47
|
+
SubscriptionUpdateSerializer,
|
48
|
+
SubscriptionUsageSerializer,
|
49
|
+
TariffSerializer,
|
51
50
|
)
|
52
51
|
|
53
52
|
# Webhook serializers
|
54
53
|
from .webhooks import (
|
55
|
-
WebhookSerializer,
|
56
54
|
NowPaymentsWebhookSerializer,
|
55
|
+
WebhookSerializer,
|
57
56
|
)
|
58
57
|
|
59
58
|
__all__ = [
|
60
59
|
# Payment serializers
|
61
60
|
'PaymentSerializer',
|
62
|
-
'PaymentCreateSerializer',
|
61
|
+
'PaymentCreateSerializer',
|
63
62
|
'PaymentListSerializer',
|
64
63
|
'PaymentStatusSerializer',
|
65
|
-
|
64
|
+
|
66
65
|
# Balance serializers
|
67
66
|
'UserBalanceSerializer',
|
68
67
|
'TransactionSerializer',
|
69
68
|
'BalanceUpdateSerializer',
|
70
|
-
|
69
|
+
|
71
70
|
# Subscription serializers
|
72
71
|
'SubscriptionSerializer',
|
73
72
|
'SubscriptionCreateSerializer',
|
@@ -77,13 +76,13 @@ __all__ = [
|
|
77
76
|
'SubscriptionStatsSerializer',
|
78
77
|
'EndpointGroupSerializer',
|
79
78
|
'TariffSerializer',
|
80
|
-
|
79
|
+
|
81
80
|
# Currency serializers
|
82
81
|
'CurrencySerializer',
|
83
82
|
'NetworkSerializer',
|
84
83
|
'ProviderCurrencySerializer',
|
85
84
|
'CurrencyConversionSerializer',
|
86
|
-
|
85
|
+
|
87
86
|
# API Key serializers
|
88
87
|
'APIKeyDetailSerializer',
|
89
88
|
'APIKeyCreateSerializer',
|
@@ -92,7 +91,7 @@ __all__ = [
|
|
92
91
|
'APIKeyActionSerializer',
|
93
92
|
'APIKeyValidationSerializer',
|
94
93
|
'APIKeyStatsSerializer',
|
95
|
-
|
94
|
+
|
96
95
|
# Webhook serializers
|
97
96
|
'WebhookSerializer',
|
98
97
|
'NowPaymentsWebhookSerializer',
|
@@ -4,14 +4,15 @@ API Key serializers for the Universal Payment System v2.0.
|
|
4
4
|
DRF serializers for API key operations with service integration.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from
|
8
|
-
|
7
|
+
from typing import Any, Dict
|
8
|
+
|
9
9
|
from django.contrib.auth import get_user_model
|
10
|
-
from
|
10
|
+
from rest_framework import serializers
|
11
11
|
|
12
|
-
from ...models import APIKey
|
13
12
|
from django_cfg.modules.django_logging import get_logger
|
14
13
|
|
14
|
+
from ...models import APIKey
|
15
|
+
|
15
16
|
User = get_user_model()
|
16
17
|
logger = get_logger("api_key_serializers")
|
17
18
|
|
@@ -22,11 +23,11 @@ class APIKeyListSerializer(serializers.ModelSerializer):
|
|
22
23
|
|
23
24
|
Optimized for API key lists with minimal data (no key value).
|
24
25
|
"""
|
25
|
-
|
26
|
+
|
26
27
|
user = serializers.StringRelatedField(read_only=True)
|
27
28
|
is_expired = serializers.BooleanField(read_only=True)
|
28
29
|
is_valid = serializers.BooleanField(read_only=True)
|
29
|
-
|
30
|
+
|
30
31
|
class Meta:
|
31
32
|
model = APIKey
|
32
33
|
fields = [
|
@@ -83,7 +84,7 @@ class APIKeyCreateSerializer(serializers.Serializer):
|
|
83
84
|
|
84
85
|
Creates new API keys and returns the full key value (only once).
|
85
86
|
"""
|
86
|
-
|
87
|
+
|
87
88
|
name = serializers.CharField(
|
88
89
|
max_length=100,
|
89
90
|
help_text="Descriptive name for the API key"
|
@@ -95,38 +96,38 @@ class APIKeyCreateSerializer(serializers.Serializer):
|
|
95
96
|
max_value=365,
|
96
97
|
help_text="Expiration in days (optional, null for no expiration)"
|
97
98
|
)
|
98
|
-
|
99
|
+
|
99
100
|
def validate_name(self, value: str) -> str:
|
100
101
|
"""Validate API key name is unique for user."""
|
101
102
|
user = self.context['request'].user
|
102
103
|
user_id = self.context.get('user_pk', user.id)
|
103
|
-
|
104
|
+
|
104
105
|
if APIKey.objects.filter(user_id=user_id, name=value).exists():
|
105
106
|
raise serializers.ValidationError(f"API key with name '{value}' already exists")
|
106
|
-
|
107
|
+
|
107
108
|
return value
|
108
|
-
|
109
|
+
|
109
110
|
def create(self, validated_data: Dict[str, Any]) -> APIKey:
|
110
111
|
"""Create API key using APIKey manager."""
|
111
112
|
try:
|
112
113
|
user = self.context['request'].user
|
113
114
|
user_id = self.context.get('user_pk', user.id)
|
114
|
-
|
115
|
+
|
115
116
|
# Get user object if creating for different user (admin only)
|
116
117
|
if str(user_id) != str(user.id):
|
117
118
|
if not user.is_staff:
|
118
119
|
raise serializers.ValidationError("Only staff can create API keys for other users")
|
119
120
|
user = User.objects.get(id=user_id)
|
120
|
-
|
121
|
+
|
121
122
|
# Create API key using manager
|
122
123
|
api_key = APIKey.create_for_user(
|
123
124
|
user=user,
|
124
125
|
name=validated_data['name'],
|
125
126
|
expires_in_days=validated_data.get('expires_in_days')
|
126
127
|
)
|
127
|
-
|
128
|
+
|
128
129
|
if api_key:
|
129
|
-
logger.info(
|
130
|
+
logger.info("API key created successfully", extra={
|
130
131
|
'api_key_id': str(api_key.id),
|
131
132
|
'user_id': user.id,
|
132
133
|
'name': validated_data['name']
|
@@ -134,21 +135,21 @@ class APIKeyCreateSerializer(serializers.Serializer):
|
|
134
135
|
return api_key
|
135
136
|
else:
|
136
137
|
raise serializers.ValidationError("Failed to create API key")
|
137
|
-
|
138
|
+
|
138
139
|
except User.DoesNotExist:
|
139
140
|
raise serializers.ValidationError(f"User {user_id} not found")
|
140
141
|
except Exception as e:
|
141
142
|
logger.error(f"API key creation error: {e}")
|
142
143
|
raise serializers.ValidationError(f"API key creation failed: {e}")
|
143
|
-
|
144
|
+
|
144
145
|
def to_representation(self, instance: APIKey) -> Dict[str, Any]:
|
145
146
|
"""Return API key data with full key value (only on creation)."""
|
146
147
|
data = APIKeyDetailSerializer(instance, context=self.context).data
|
147
|
-
|
148
|
+
|
148
149
|
# Add full key value only on creation (security: shown only once)
|
149
150
|
data['key'] = instance.key
|
150
151
|
data['warning'] = "This is the only time the full API key will be shown. Please save it securely."
|
151
|
-
|
152
|
+
|
152
153
|
return data
|
153
154
|
|
154
155
|
|
@@ -158,46 +159,46 @@ class APIKeyUpdateSerializer(serializers.ModelSerializer):
|
|
158
159
|
|
159
160
|
Allows updating name and active status only.
|
160
161
|
"""
|
161
|
-
|
162
|
+
|
162
163
|
class Meta:
|
163
164
|
model = APIKey
|
164
165
|
fields = ['name', 'is_active']
|
165
|
-
|
166
|
+
|
166
167
|
def validate_name(self, value: str) -> str:
|
167
168
|
"""Validate API key name is unique for user."""
|
168
169
|
user_id = self.instance.user_id
|
169
|
-
|
170
|
+
|
170
171
|
# Check if another API key with same name exists for this user
|
171
172
|
existing = APIKey.objects.filter(
|
172
173
|
user_id=user_id,
|
173
174
|
name=value
|
174
175
|
).exclude(id=self.instance.id)
|
175
|
-
|
176
|
+
|
176
177
|
if existing.exists():
|
177
178
|
raise serializers.ValidationError(f"API key with name '{value}' already exists")
|
178
|
-
|
179
|
+
|
179
180
|
return value
|
180
|
-
|
181
|
+
|
181
182
|
def update(self, instance: APIKey, validated_data: Dict[str, Any]) -> APIKey:
|
182
183
|
"""Update API key with logging."""
|
183
184
|
old_name = instance.name
|
184
185
|
old_active = instance.is_active
|
185
|
-
|
186
|
+
|
186
187
|
instance = super().update(instance, validated_data)
|
187
|
-
|
188
|
+
|
188
189
|
# Log changes
|
189
190
|
changes = []
|
190
191
|
if instance.name != old_name:
|
191
192
|
changes.append(f"name: {old_name} → {instance.name}")
|
192
193
|
if instance.is_active != old_active:
|
193
194
|
changes.append(f"active: {old_active} → {instance.is_active}")
|
194
|
-
|
195
|
+
|
195
196
|
if changes:
|
196
197
|
logger.info(f"API key updated: {', '.join(changes)}", extra={
|
197
198
|
'api_key_id': str(instance.id),
|
198
199
|
'user_id': instance.user_id
|
199
200
|
})
|
200
|
-
|
201
|
+
|
201
202
|
return instance
|
202
203
|
|
203
204
|
|
@@ -207,7 +208,7 @@ class APIKeyActionSerializer(serializers.Serializer):
|
|
207
208
|
|
208
209
|
Handles deactivation, extension, and usage increment.
|
209
210
|
"""
|
210
|
-
|
211
|
+
|
211
212
|
action = serializers.ChoiceField(
|
212
213
|
choices=[
|
213
214
|
('deactivate', 'Deactivate'),
|
@@ -233,48 +234,48 @@ class APIKeyActionSerializer(serializers.Serializer):
|
|
233
234
|
allow_null=True,
|
234
235
|
help_text="IP address for usage tracking"
|
235
236
|
)
|
236
|
-
|
237
|
+
|
237
238
|
def validate(self, attrs: Dict[str, Any]) -> Dict[str, Any]:
|
238
239
|
"""Validate action-specific requirements."""
|
239
240
|
action = attrs.get('action')
|
240
|
-
|
241
|
+
|
241
242
|
if action == 'extend' and not attrs.get('days'):
|
242
243
|
raise serializers.ValidationError("days is required for extend action")
|
243
|
-
|
244
|
+
|
244
245
|
return attrs
|
245
|
-
|
246
|
+
|
246
247
|
def save(self) -> Dict[str, Any]:
|
247
248
|
"""Perform API key action."""
|
248
249
|
try:
|
249
250
|
api_key_id = self.context.get('api_key_id')
|
250
251
|
if not api_key_id:
|
251
252
|
raise serializers.ValidationError("API key ID is required")
|
252
|
-
|
253
|
+
|
253
254
|
api_key = APIKey.objects.get(id=api_key_id)
|
254
255
|
action = self.validated_data['action']
|
255
|
-
|
256
|
+
|
256
257
|
if action == 'deactivate':
|
257
258
|
reason = self.validated_data.get('reason')
|
258
259
|
success = api_key.deactivate(reason=reason)
|
259
|
-
message =
|
260
|
-
|
260
|
+
message = "API key deactivated successfully"
|
261
|
+
|
261
262
|
elif action == 'extend':
|
262
263
|
days = self.validated_data['days']
|
263
264
|
success = api_key.extend_expiry(days=days)
|
264
265
|
message = f"API key expiration extended by {days} days"
|
265
|
-
|
266
|
+
|
266
267
|
elif action == 'increment_usage':
|
267
268
|
ip_address = self.validated_data.get('ip_address')
|
268
269
|
success = api_key.increment_usage(ip_address=ip_address)
|
269
|
-
message =
|
270
|
-
|
270
|
+
message = "API key usage incremented"
|
271
|
+
|
271
272
|
else:
|
272
273
|
raise serializers.ValidationError(f"Unknown action: {action}")
|
273
|
-
|
274
|
+
|
274
275
|
if success:
|
275
276
|
# Refresh from database
|
276
277
|
api_key.refresh_from_db()
|
277
|
-
|
278
|
+
|
278
279
|
return {
|
279
280
|
'success': True,
|
280
281
|
'message': message,
|
@@ -286,7 +287,7 @@ class APIKeyActionSerializer(serializers.Serializer):
|
|
286
287
|
'error': f"Failed to {action} API key",
|
287
288
|
'error_code': f'{action}_failed'
|
288
289
|
}
|
289
|
-
|
290
|
+
|
290
291
|
except APIKey.DoesNotExist:
|
291
292
|
return {
|
292
293
|
'success': False,
|
@@ -308,25 +309,25 @@ class APIKeyValidationSerializer(serializers.Serializer):
|
|
308
309
|
|
309
310
|
Validates API key and returns key information.
|
310
311
|
"""
|
311
|
-
|
312
|
+
|
312
313
|
key = serializers.CharField(
|
313
314
|
min_length=32,
|
314
315
|
max_length=64,
|
315
316
|
help_text="API key to validate"
|
316
317
|
)
|
317
|
-
|
318
|
+
|
318
319
|
def validate_key(self, value: str) -> str:
|
319
320
|
"""Validate API key format."""
|
320
321
|
if not value.startswith('pk_'):
|
321
322
|
raise serializers.ValidationError("Invalid API key format")
|
322
323
|
return value
|
323
|
-
|
324
|
+
|
324
325
|
def save(self) -> Dict[str, Any]:
|
325
326
|
"""Validate API key and return information."""
|
326
327
|
try:
|
327
328
|
key_value = self.validated_data['key']
|
328
329
|
api_key = APIKey.get_valid_key(key_value)
|
329
|
-
|
330
|
+
|
330
331
|
if api_key:
|
331
332
|
return {
|
332
333
|
'success': True,
|
@@ -341,7 +342,7 @@ class APIKeyValidationSerializer(serializers.Serializer):
|
|
341
342
|
'api_key': None,
|
342
343
|
'message': 'API key is invalid or expired'
|
343
344
|
}
|
344
|
-
|
345
|
+
|
345
346
|
except Exception as e:
|
346
347
|
logger.error(f"API key validation error: {e}")
|
347
348
|
return {
|
@@ -371,31 +372,32 @@ class APIKeyStatsSerializer(serializers.Serializer):
|
|
371
372
|
|
372
373
|
Used for API key analytics and reporting.
|
373
374
|
"""
|
374
|
-
|
375
|
+
|
375
376
|
days = serializers.IntegerField(
|
376
377
|
default=30,
|
377
378
|
min_value=1,
|
378
379
|
max_value=365,
|
379
380
|
help_text="Number of days to analyze"
|
380
381
|
)
|
381
|
-
|
382
|
+
|
382
383
|
def save(self) -> Dict[str, Any]:
|
383
384
|
"""Get API key statistics."""
|
384
385
|
try:
|
386
|
+
from datetime import timedelta
|
387
|
+
|
385
388
|
from django.db import models
|
386
389
|
from django.utils import timezone
|
387
|
-
|
388
|
-
|
390
|
+
|
389
391
|
days = self.validated_data['days']
|
390
392
|
since_date = timezone.now() - timedelta(days=days)
|
391
|
-
|
393
|
+
|
392
394
|
# Get user-specific stats if user context provided
|
393
395
|
user_id = self.context.get('user_pk')
|
394
396
|
if user_id:
|
395
397
|
queryset = APIKey.objects.filter(user_id=user_id)
|
396
398
|
else:
|
397
399
|
queryset = APIKey.objects.all()
|
398
|
-
|
400
|
+
|
399
401
|
stats = queryset.aggregate(
|
400
402
|
total_keys=models.Count('id'),
|
401
403
|
active_keys=models.Count('id', filter=models.Q(is_active=True)),
|
@@ -406,7 +408,7 @@ class APIKeyStatsSerializer(serializers.Serializer):
|
|
406
408
|
filter=models.Q(last_used_at__gte=since_date)
|
407
409
|
),
|
408
410
|
)
|
409
|
-
|
411
|
+
|
410
412
|
return {
|
411
413
|
'success': True,
|
412
414
|
'stats': {
|
@@ -418,7 +420,7 @@ class APIKeyStatsSerializer(serializers.Serializer):
|
|
418
420
|
'period_days': days,
|
419
421
|
'generated_at': timezone.now().isoformat()
|
420
422
|
}
|
421
|
-
|
423
|
+
|
422
424
|
except Exception as e:
|
423
425
|
logger.error(f"API key stats error: {e}")
|
424
426
|
return {
|
@@ -4,15 +4,16 @@ Balance serializers for the Universal Payment System v2.0.
|
|
4
4
|
DRF serializers for balance and transaction operations with service integration.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from
|
8
|
-
|
9
|
-
from typing import Dict, Any
|
7
|
+
from typing import Any, Dict
|
8
|
+
|
10
9
|
from django.contrib.auth import get_user_model
|
10
|
+
from rest_framework import serializers
|
11
11
|
|
12
|
-
from ...models import UserBalance, Transaction
|
13
|
-
from ...services import get_balance_service, BalanceUpdateRequest
|
14
12
|
from django_cfg.modules.django_logging import get_logger
|
15
13
|
|
14
|
+
from ...models import Transaction, UserBalance
|
15
|
+
from ...services import BalanceUpdateRequest, get_balance_service
|
16
|
+
|
16
17
|
User = get_user_model()
|
17
18
|
logger = get_logger("balance_serializers")
|
18
19
|
|
@@ -23,9 +24,9 @@ class UserBalanceSerializer(serializers.ModelSerializer):
|
|
23
24
|
|
24
25
|
Provides balance information with display helpers.
|
25
26
|
"""
|
26
|
-
|
27
|
+
|
27
28
|
user = serializers.StringRelatedField(read_only=True)
|
28
|
-
|
29
|
+
|
29
30
|
class Meta:
|
30
31
|
model = UserBalance
|
31
32
|
fields = [
|
@@ -46,13 +47,13 @@ class TransactionSerializer(serializers.ModelSerializer):
|
|
46
47
|
|
47
48
|
Used for transaction history and details.
|
48
49
|
"""
|
49
|
-
|
50
|
+
|
50
51
|
user = serializers.StringRelatedField(read_only=True)
|
51
52
|
amount_display = serializers.CharField(read_only=True)
|
52
53
|
type_color = serializers.CharField(read_only=True)
|
53
54
|
is_credit = serializers.BooleanField(read_only=True)
|
54
55
|
is_debit = serializers.BooleanField(read_only=True)
|
55
|
-
|
56
|
+
|
56
57
|
class Meta:
|
57
58
|
model = Transaction
|
58
59
|
fields = [
|
@@ -78,7 +79,7 @@ class BalanceUpdateSerializer(serializers.Serializer):
|
|
78
79
|
|
79
80
|
Validates and processes balance updates through BalanceService.
|
80
81
|
"""
|
81
|
-
|
82
|
+
|
82
83
|
amount = serializers.FloatField(
|
83
84
|
help_text="Amount to add (positive) or subtract (negative)"
|
84
85
|
)
|
@@ -110,46 +111,46 @@ class BalanceUpdateSerializer(serializers.Serializer):
|
|
110
111
|
default=dict,
|
111
112
|
help_text="Additional metadata"
|
112
113
|
)
|
113
|
-
|
114
|
+
|
114
115
|
def validate_amount(self, value: float) -> float:
|
115
116
|
"""Validate amount is not zero."""
|
116
117
|
if value == 0:
|
117
118
|
raise serializers.ValidationError("Amount cannot be zero")
|
118
119
|
return value
|
119
|
-
|
120
|
+
|
120
121
|
def validate(self, attrs: Dict[str, Any]) -> Dict[str, Any]:
|
121
122
|
"""Validate balance update data."""
|
122
123
|
try:
|
123
124
|
# Get user from context
|
124
125
|
user_id = self.context.get('user_pk') or self.context['request'].user.id
|
125
|
-
|
126
|
+
|
126
127
|
# Create Pydantic request for validation
|
127
128
|
request = BalanceUpdateRequest(
|
128
129
|
user_id=user_id,
|
129
130
|
**attrs
|
130
131
|
)
|
131
|
-
|
132
|
+
|
132
133
|
# Store validated request for save method
|
133
134
|
self._validated_request = request
|
134
135
|
return attrs
|
135
|
-
|
136
|
+
|
136
137
|
except Exception as e:
|
137
138
|
logger.error(f"Balance update validation failed: {e}")
|
138
139
|
raise serializers.ValidationError(f"Invalid balance update data: {e}")
|
139
|
-
|
140
|
+
|
140
141
|
def save(self) -> Dict[str, Any]:
|
141
142
|
"""Update balance using BalanceService."""
|
142
143
|
try:
|
143
144
|
balance_service = get_balance_service()
|
144
145
|
result = balance_service.update_balance(self._validated_request)
|
145
|
-
|
146
|
+
|
146
147
|
if result.success:
|
147
|
-
logger.info(
|
148
|
+
logger.info("Balance updated successfully", extra={
|
148
149
|
'user_id': self._validated_request.user_id,
|
149
150
|
'amount': self._validated_request.amount,
|
150
151
|
'transaction_id': result.transaction_id
|
151
152
|
})
|
152
|
-
|
153
|
+
|
153
154
|
return {
|
154
155
|
'success': True,
|
155
156
|
'message': result.message,
|
@@ -167,7 +168,7 @@ class BalanceUpdateSerializer(serializers.Serializer):
|
|
167
168
|
'error': result.message,
|
168
169
|
'error_code': result.error_code
|
169
170
|
}
|
170
|
-
|
171
|
+
|
171
172
|
except Exception as e:
|
172
173
|
logger.error(f"Balance update error: {e}")
|
173
174
|
return {
|
@@ -183,7 +184,7 @@ class FundsTransferSerializer(serializers.Serializer):
|
|
183
184
|
|
184
185
|
Handles user-to-user fund transfers through BalanceService.
|
185
186
|
"""
|
186
|
-
|
187
|
+
|
187
188
|
to_user_id = serializers.IntegerField(
|
188
189
|
min_value=1,
|
189
190
|
help_text="Destination user ID"
|
@@ -198,23 +199,23 @@ class FundsTransferSerializer(serializers.Serializer):
|
|
198
199
|
max_length=500,
|
199
200
|
help_text="Transfer description"
|
200
201
|
)
|
201
|
-
|
202
|
+
|
202
203
|
def validate_to_user_id(self, value: int) -> int:
|
203
204
|
"""Validate destination user exists."""
|
204
205
|
if not User.objects.filter(id=value).exists():
|
205
206
|
raise serializers.ValidationError(f"User {value} not found")
|
206
207
|
return value
|
207
|
-
|
208
|
+
|
208
209
|
def validate(self, attrs: Dict[str, Any]) -> Dict[str, Any]:
|
209
210
|
"""Validate transfer data."""
|
210
211
|
from_user_id = self.context['request'].user.id
|
211
212
|
to_user_id = attrs['to_user_id']
|
212
|
-
|
213
|
+
|
213
214
|
if from_user_id == to_user_id:
|
214
215
|
raise serializers.ValidationError("Cannot transfer to yourself")
|
215
|
-
|
216
|
+
|
216
217
|
return attrs
|
217
|
-
|
218
|
+
|
218
219
|
def save(self) -> Dict[str, Any]:
|
219
220
|
"""Execute transfer using BalanceService."""
|
220
221
|
try:
|
@@ -222,7 +223,7 @@ class FundsTransferSerializer(serializers.Serializer):
|
|
222
223
|
to_user_id = self.validated_data['to_user_id']
|
223
224
|
amount = self.validated_data['amount']
|
224
225
|
description = self.validated_data.get('description')
|
225
|
-
|
226
|
+
|
226
227
|
balance_service = get_balance_service()
|
227
228
|
result = balance_service.transfer_funds(
|
228
229
|
from_user_id=from_user_id,
|
@@ -230,7 +231,7 @@ class FundsTransferSerializer(serializers.Serializer):
|
|
230
231
|
amount=amount,
|
231
232
|
description=description
|
232
233
|
)
|
233
|
-
|
234
|
+
|
234
235
|
if result.success:
|
235
236
|
return {
|
236
237
|
'success': True,
|
@@ -243,7 +244,7 @@ class FundsTransferSerializer(serializers.Serializer):
|
|
243
244
|
'error': result.message,
|
244
245
|
'error_code': result.error_code
|
245
246
|
}
|
246
|
-
|
247
|
+
|
247
248
|
except Exception as e:
|
248
249
|
logger.error(f"Funds transfer error: {e}")
|
249
250
|
return {
|
@@ -259,14 +260,14 @@ class BalanceStatsSerializer(serializers.Serializer):
|
|
259
260
|
|
260
261
|
Used for balance analytics and reporting.
|
261
262
|
"""
|
262
|
-
|
263
|
+
|
263
264
|
days = serializers.IntegerField(
|
264
265
|
default=30,
|
265
266
|
min_value=1,
|
266
267
|
max_value=365,
|
267
268
|
help_text="Number of days to analyze"
|
268
269
|
)
|
269
|
-
|
270
|
+
|
270
271
|
def save(self) -> Dict[str, Any]:
|
271
272
|
"""Get balance statistics using BalanceService."""
|
272
273
|
try:
|
@@ -274,7 +275,7 @@ class BalanceStatsSerializer(serializers.Serializer):
|
|
274
275
|
result = balance_service.get_balance_stats(
|
275
276
|
days=self.validated_data['days']
|
276
277
|
)
|
277
|
-
|
278
|
+
|
278
279
|
if result.success:
|
279
280
|
return {
|
280
281
|
'success': True,
|
@@ -287,7 +288,7 @@ class BalanceStatsSerializer(serializers.Serializer):
|
|
287
288
|
'error': result.message,
|
288
289
|
'error_code': result.error_code
|
289
290
|
}
|
290
|
-
|
291
|
+
|
291
292
|
except Exception as e:
|
292
293
|
logger.error(f"Balance stats error: {e}")
|
293
294
|
return {
|