django-cfg 1.4.21__py3-none-any.whl → 1.4.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -4,11 +4,11 @@ Balance and transaction models for the Universal Payment System v2.0.
|
|
4
4
|
Handles user balances and transaction history with atomic operations.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.db import models, transaction
|
8
7
|
from django.contrib.auth import get_user_model
|
9
|
-
from django.core.validators import MinValueValidator
|
10
8
|
from django.core.exceptions import ValidationError
|
11
|
-
from django.
|
9
|
+
from django.core.validators import MinValueValidator
|
10
|
+
from django.db import models
|
11
|
+
|
12
12
|
from .base import UUIDTimestampedModel
|
13
13
|
|
14
14
|
User = get_user_model()
|
@@ -21,53 +21,53 @@ class UserBalance(models.Model):
|
|
21
21
|
Tracks user balance in USD (float for performance as per requirements).
|
22
22
|
All balance updates are handled via Django signals for consistency.
|
23
23
|
"""
|
24
|
-
|
24
|
+
|
25
25
|
user = models.OneToOneField(
|
26
26
|
User,
|
27
27
|
on_delete=models.CASCADE,
|
28
28
|
related_name='payment_balance',
|
29
29
|
help_text="User who owns this balance"
|
30
30
|
)
|
31
|
-
|
31
|
+
|
32
32
|
balance_usd = models.FloatField(
|
33
33
|
default=0.0,
|
34
34
|
validators=[MinValueValidator(0.0)],
|
35
35
|
help_text="Current balance in USD (float for performance)"
|
36
36
|
)
|
37
|
-
|
37
|
+
|
38
38
|
reserved_usd = models.FloatField(
|
39
39
|
default=0.0,
|
40
40
|
validators=[MinValueValidator(0.0)],
|
41
41
|
help_text="Reserved amount in USD (pending transactions)"
|
42
42
|
)
|
43
|
-
|
43
|
+
|
44
44
|
# Tracking fields
|
45
45
|
total_deposited = models.FloatField(
|
46
46
|
default=0.0,
|
47
47
|
validators=[MinValueValidator(0.0)],
|
48
48
|
help_text="Total amount deposited (lifetime)"
|
49
49
|
)
|
50
|
-
|
50
|
+
|
51
51
|
total_spent = models.FloatField(
|
52
52
|
default=0.0,
|
53
53
|
validators=[MinValueValidator(0.0)],
|
54
54
|
help_text="Total amount spent (lifetime)"
|
55
55
|
)
|
56
|
-
|
56
|
+
|
57
57
|
last_transaction_at = models.DateTimeField(
|
58
58
|
null=True,
|
59
59
|
blank=True,
|
60
60
|
help_text="When the last transaction occurred"
|
61
61
|
)
|
62
|
-
|
62
|
+
|
63
63
|
# Timestamps
|
64
64
|
created_at = models.DateTimeField(auto_now_add=True)
|
65
65
|
updated_at = models.DateTimeField(auto_now=True)
|
66
|
-
|
66
|
+
|
67
67
|
# Manager
|
68
68
|
from .managers.balance_managers import UserBalanceManager
|
69
69
|
objects = UserBalanceManager()
|
70
|
-
|
70
|
+
|
71
71
|
class Meta:
|
72
72
|
db_table = 'payments_user_balances'
|
73
73
|
verbose_name = 'User Balance'
|
@@ -86,46 +86,46 @@ class UserBalance(models.Model):
|
|
86
86
|
name='reserved_non_negative_check'
|
87
87
|
),
|
88
88
|
]
|
89
|
-
|
89
|
+
|
90
90
|
def __str__(self):
|
91
91
|
return f"{self.user.username}: ${self.balance_usd:.2f}"
|
92
|
-
|
92
|
+
|
93
93
|
def clean(self):
|
94
94
|
"""Validate balance data."""
|
95
95
|
if self.balance_usd < 0:
|
96
96
|
raise ValidationError("Balance cannot be negative")
|
97
97
|
if self.reserved_usd < 0:
|
98
98
|
raise ValidationError("Reserved amount cannot be negative")
|
99
|
-
|
99
|
+
|
100
100
|
@property
|
101
101
|
def balance_display(self) -> str:
|
102
102
|
"""Formatted balance display."""
|
103
103
|
return f"${self.balance_usd:.2f} USD"
|
104
|
-
|
104
|
+
|
105
105
|
@property
|
106
106
|
def is_empty(self) -> bool:
|
107
107
|
"""Check if balance is zero."""
|
108
108
|
return self.balance_usd == 0.0
|
109
|
-
|
109
|
+
|
110
110
|
@property
|
111
111
|
def has_transactions(self) -> bool:
|
112
112
|
"""Check if user has any transactions."""
|
113
113
|
return self.last_transaction_at is not None
|
114
|
-
|
115
|
-
def add_funds(self, amount: float, transaction_type: str = 'deposit',
|
114
|
+
|
115
|
+
def add_funds(self, amount: float, transaction_type: str = 'deposit',
|
116
116
|
description: str = None, payment_id: str = None) -> 'Transaction':
|
117
117
|
"""Add funds to balance (delegates to manager)."""
|
118
118
|
return self.__class__.objects.add_funds_to_user(
|
119
119
|
self.user, amount, transaction_type, description, payment_id
|
120
120
|
)
|
121
|
-
|
121
|
+
|
122
122
|
def subtract_funds(self, amount: float, transaction_type: str = 'withdrawal',
|
123
123
|
description: str = None, payment_id: str = None) -> 'Transaction':
|
124
124
|
"""Subtract funds from balance (delegates to manager)."""
|
125
125
|
return self.__class__.objects.subtract_funds_from_user(
|
126
126
|
self.user, amount, transaction_type, description, payment_id
|
127
127
|
)
|
128
|
-
|
128
|
+
|
129
129
|
@classmethod
|
130
130
|
def get_or_create_for_user(cls, user: User) -> 'UserBalance':
|
131
131
|
"""Get or create balance for user (delegates to manager)."""
|
@@ -140,7 +140,7 @@ class Transaction(UUIDTimestampedModel):
|
|
140
140
|
|
141
141
|
Immutable record of all balance changes with full audit trail.
|
142
142
|
"""
|
143
|
-
|
143
|
+
|
144
144
|
class TransactionType(models.TextChoices):
|
145
145
|
DEPOSIT = "deposit", "Deposit"
|
146
146
|
WITHDRAWAL = "withdrawal", "Withdrawal"
|
@@ -149,30 +149,30 @@ class Transaction(UUIDTimestampedModel):
|
|
149
149
|
FEE = "fee", "Fee"
|
150
150
|
BONUS = "bonus", "Bonus"
|
151
151
|
ADJUSTMENT = "adjustment", "Adjustment"
|
152
|
-
|
152
|
+
|
153
153
|
user = models.ForeignKey(
|
154
154
|
User,
|
155
155
|
on_delete=models.CASCADE,
|
156
156
|
related_name='payment_transactions',
|
157
157
|
help_text="User who owns this transaction"
|
158
158
|
)
|
159
|
-
|
159
|
+
|
160
160
|
transaction_type = models.CharField(
|
161
161
|
max_length=20,
|
162
162
|
choices=TransactionType.choices,
|
163
163
|
help_text="Type of transaction"
|
164
164
|
)
|
165
|
-
|
165
|
+
|
166
166
|
# Amount in USD (float for performance, positive for credits, negative for debits)
|
167
167
|
amount_usd = models.FloatField(
|
168
168
|
help_text="Transaction amount in USD (positive=credit, negative=debit)"
|
169
169
|
)
|
170
|
-
|
170
|
+
|
171
171
|
balance_after = models.FloatField(
|
172
172
|
validators=[MinValueValidator(0.0)],
|
173
173
|
help_text="User balance after this transaction"
|
174
174
|
)
|
175
|
-
|
175
|
+
|
176
176
|
# Reference to related payment
|
177
177
|
payment_id = models.CharField(
|
178
178
|
max_length=100,
|
@@ -181,23 +181,23 @@ class Transaction(UUIDTimestampedModel):
|
|
181
181
|
db_index=True,
|
182
182
|
help_text="Related payment ID (if applicable)"
|
183
183
|
)
|
184
|
-
|
184
|
+
|
185
185
|
# Transaction details
|
186
186
|
description = models.TextField(
|
187
187
|
help_text="Transaction description"
|
188
188
|
)
|
189
|
-
|
189
|
+
|
190
190
|
# Metadata for additional information
|
191
191
|
metadata = models.JSONField(
|
192
192
|
default=dict,
|
193
193
|
blank=True,
|
194
194
|
help_text="Additional transaction metadata"
|
195
195
|
)
|
196
|
-
|
196
|
+
|
197
197
|
# Manager
|
198
198
|
from .managers.balance_managers import TransactionManager
|
199
199
|
objects = TransactionManager()
|
200
|
-
|
200
|
+
|
201
201
|
class Meta:
|
202
202
|
db_table = 'payments_transactions'
|
203
203
|
verbose_name = 'Transaction'
|
@@ -209,32 +209,32 @@ class Transaction(UUIDTimestampedModel):
|
|
209
209
|
models.Index(fields=['payment_id']),
|
210
210
|
models.Index(fields=['amount_usd']),
|
211
211
|
]
|
212
|
-
|
212
|
+
|
213
213
|
def __str__(self):
|
214
214
|
sign = "+" if self.amount_usd >= 0 else ""
|
215
215
|
return f"{self.user.username}: {sign}${self.amount_usd:.2f} ({self.transaction_type})"
|
216
|
-
|
216
|
+
|
217
217
|
def clean(self):
|
218
218
|
"""Validate transaction data."""
|
219
219
|
if self.balance_after < 0:
|
220
220
|
raise ValidationError("Balance after transaction cannot be negative")
|
221
|
-
|
221
|
+
|
222
222
|
@property
|
223
223
|
def is_credit(self) -> bool:
|
224
224
|
"""Check if this is a credit transaction."""
|
225
225
|
return self.amount_usd > 0
|
226
|
-
|
226
|
+
|
227
227
|
@property
|
228
228
|
def is_debit(self) -> bool:
|
229
229
|
"""Check if this is a debit transaction."""
|
230
230
|
return self.amount_usd < 0
|
231
|
-
|
231
|
+
|
232
232
|
@property
|
233
233
|
def amount_display(self) -> str:
|
234
234
|
"""Formatted amount display."""
|
235
235
|
sign = "+" if self.amount_usd >= 0 else ""
|
236
236
|
return f"{sign}${abs(self.amount_usd):.2f}"
|
237
|
-
|
237
|
+
|
238
238
|
@property
|
239
239
|
def type_color(self) -> str:
|
240
240
|
"""Get color for transaction type display."""
|
@@ -248,7 +248,7 @@ class Transaction(UUIDTimestampedModel):
|
|
248
248
|
self.TransactionType.ADJUSTMENT: 'secondary',
|
249
249
|
}
|
250
250
|
return colors.get(self.transaction_type, 'secondary')
|
251
|
-
|
251
|
+
|
252
252
|
def save(self, *args, **kwargs):
|
253
253
|
"""Override save to ensure immutability."""
|
254
254
|
# Only prevent updates, not creation
|
@@ -5,6 +5,7 @@ Provides common functionality for all payment-related models.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import uuid
|
8
|
+
|
8
9
|
from django.db import models
|
9
10
|
from django.utils import timezone
|
10
11
|
|
@@ -18,42 +19,42 @@ class UUIDTimestampedModel(models.Model):
|
|
18
19
|
- Created/updated timestamps with timezone awareness
|
19
20
|
- Common functionality for all payment models
|
20
21
|
"""
|
21
|
-
|
22
|
+
|
22
23
|
id = models.UUIDField(
|
23
24
|
primary_key=True,
|
24
25
|
default=uuid.uuid4,
|
25
26
|
editable=False,
|
26
27
|
help_text="Unique identifier for this record"
|
27
28
|
)
|
28
|
-
|
29
|
+
|
29
30
|
created_at = models.DateTimeField(
|
30
31
|
auto_now_add=True,
|
31
32
|
db_index=True,
|
32
33
|
help_text="When this record was created"
|
33
34
|
)
|
34
|
-
|
35
|
+
|
35
36
|
updated_at = models.DateTimeField(
|
36
37
|
auto_now=True,
|
37
38
|
help_text="When this record was last updated"
|
38
39
|
)
|
39
|
-
|
40
|
+
|
40
41
|
class Meta:
|
41
42
|
abstract = True
|
42
43
|
ordering = ['-created_at']
|
43
|
-
|
44
|
+
|
44
45
|
def __str__(self):
|
45
46
|
"""String representation showing ID and creation time."""
|
46
47
|
return f"{self.__class__.__name__}({str(self.id)[:8]}...)"
|
47
|
-
|
48
|
+
|
48
49
|
def __repr__(self):
|
49
50
|
"""Developer-friendly representation."""
|
50
51
|
return f"<{self.__class__.__name__}: {str(self.id)}>"
|
51
|
-
|
52
|
+
|
52
53
|
@property
|
53
54
|
def age_in_seconds(self) -> int:
|
54
55
|
"""Get age of this record in seconds."""
|
55
56
|
return int((timezone.now() - self.created_at).total_seconds())
|
56
|
-
|
57
|
+
|
57
58
|
@property
|
58
59
|
def is_recent(self) -> bool:
|
59
60
|
"""Check if record was created in the last hour."""
|
@@ -66,18 +67,18 @@ class TimestampedModel(models.Model):
|
|
66
67
|
|
67
68
|
Use this for models that don't need UUID (like configuration models).
|
68
69
|
"""
|
69
|
-
|
70
|
+
|
70
71
|
created_at = models.DateTimeField(
|
71
72
|
auto_now_add=True,
|
72
73
|
db_index=True,
|
73
74
|
help_text="When this record was created"
|
74
75
|
)
|
75
|
-
|
76
|
+
|
76
77
|
updated_at = models.DateTimeField(
|
77
78
|
auto_now=True,
|
78
79
|
help_text="When this record was last updated"
|
79
80
|
)
|
80
|
-
|
81
|
+
|
81
82
|
class Meta:
|
82
83
|
abstract = True
|
83
84
|
ordering = ['-created_at']
|
@@ -4,9 +4,10 @@ Currency models for the Universal Payment System v2.0.
|
|
4
4
|
Handles multi-provider currency support with integration to django_currency module.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.db import models
|
8
|
-
from django.core.validators import MinLengthValidator, MaxLengthValidator
|
9
7
|
from django.core.exceptions import ValidationError
|
8
|
+
from django.core.validators import MaxLengthValidator, MinLengthValidator
|
9
|
+
from django.db import models
|
10
|
+
|
10
11
|
from .base import TimestampedModel
|
11
12
|
|
12
13
|
|
@@ -16,67 +17,67 @@ class Currency(TimestampedModel):
|
|
16
17
|
|
17
18
|
Integrates with django_currency module for rate conversion.
|
18
19
|
"""
|
19
|
-
|
20
|
+
|
20
21
|
class CurrencyType(models.TextChoices):
|
21
22
|
FIAT = "fiat", "Fiat Currency"
|
22
23
|
CRYPTO = "crypto", "Cryptocurrency"
|
23
|
-
|
24
|
+
|
24
25
|
code = models.CharField(
|
25
26
|
max_length=10,
|
26
27
|
unique=True,
|
27
28
|
validators=[MinLengthValidator(3), MaxLengthValidator(10)],
|
28
29
|
help_text="Currency code (e.g., BTC, USD, ETH)"
|
29
30
|
)
|
30
|
-
|
31
|
+
|
31
32
|
name = models.CharField(
|
32
33
|
max_length=100,
|
33
34
|
help_text="Full currency name (e.g., Bitcoin, US Dollar)"
|
34
35
|
)
|
35
|
-
|
36
|
+
|
36
37
|
currency_type = models.CharField(
|
37
38
|
max_length=10,
|
38
39
|
choices=CurrencyType.choices,
|
39
40
|
help_text="Type of currency"
|
40
41
|
)
|
41
|
-
|
42
|
+
|
42
43
|
symbol = models.CharField(
|
43
44
|
max_length=10,
|
44
45
|
blank=True,
|
45
46
|
help_text="Currency symbol (e.g., $, ₿, Ξ)"
|
46
47
|
)
|
47
|
-
|
48
|
+
|
48
49
|
decimal_places = models.PositiveSmallIntegerField(
|
49
50
|
default=8,
|
50
51
|
help_text="Number of decimal places for this currency"
|
51
52
|
)
|
52
|
-
|
53
|
+
|
53
54
|
is_active = models.BooleanField(
|
54
55
|
default=True,
|
55
56
|
help_text="Whether this currency is available for payments"
|
56
57
|
)
|
57
|
-
|
58
|
+
|
58
59
|
# Integration with django_currency
|
59
60
|
exchange_rate_source = models.CharField(
|
60
61
|
max_length=50,
|
61
62
|
blank=True,
|
62
63
|
help_text="Source for exchange rates (auto-detected by django_currency)"
|
63
64
|
)
|
64
|
-
|
65
|
+
|
65
66
|
usd_rate = models.FloatField(
|
66
67
|
default=1.0,
|
67
68
|
help_text="Current USD exchange rate (1 unit = X USD)"
|
68
69
|
)
|
69
|
-
|
70
|
+
|
70
71
|
usd_rate_updated_at = models.DateTimeField(
|
71
72
|
null=True,
|
72
73
|
blank=True,
|
73
74
|
help_text="When USD rate was last updated"
|
74
75
|
)
|
75
|
-
|
76
|
+
|
76
77
|
# Manager
|
77
78
|
from .managers.currency_managers import CurrencyManager
|
78
79
|
objects = CurrencyManager()
|
79
|
-
|
80
|
+
|
80
81
|
class Meta:
|
81
82
|
db_table = 'payments_currencies'
|
82
83
|
verbose_name = 'Currency'
|
@@ -86,32 +87,32 @@ class Currency(TimestampedModel):
|
|
86
87
|
models.Index(fields=['currency_type', 'is_active']),
|
87
88
|
models.Index(fields=['code']),
|
88
89
|
]
|
89
|
-
|
90
|
+
|
90
91
|
def __str__(self):
|
91
92
|
return f"{self.code} ({self.name})"
|
92
|
-
|
93
|
+
|
93
94
|
def clean(self):
|
94
95
|
"""Validate currency data."""
|
95
96
|
if self.code:
|
96
97
|
self.code = self.code.upper()
|
97
|
-
|
98
|
+
|
98
99
|
# Validate decimal places based on currency type
|
99
100
|
if self.currency_type == self.CurrencyType.FIAT and self.decimal_places > 4:
|
100
101
|
raise ValidationError("Fiat currencies should not have more than 4 decimal places")
|
101
|
-
|
102
|
+
|
102
103
|
if self.currency_type == self.CurrencyType.CRYPTO and self.decimal_places > 18:
|
103
104
|
raise ValidationError("Crypto currencies should not have more than 18 decimal places")
|
104
|
-
|
105
|
+
|
105
106
|
@property
|
106
107
|
def is_crypto(self) -> bool:
|
107
108
|
"""Check if this is a cryptocurrency."""
|
108
109
|
return self.currency_type == self.CurrencyType.CRYPTO
|
109
|
-
|
110
|
+
|
110
111
|
@property
|
111
112
|
def is_fiat(self) -> bool:
|
112
113
|
"""Check if this is a fiat currency."""
|
113
114
|
return self.currency_type == self.CurrencyType.FIAT
|
114
|
-
|
115
|
+
|
115
116
|
def get_provider_config(self, provider: str):
|
116
117
|
"""
|
117
118
|
Get provider configuration for this currency.
|
@@ -123,7 +124,7 @@ class Currency(TimestampedModel):
|
|
123
124
|
dict: Provider configuration or None
|
124
125
|
"""
|
125
126
|
return Currency.objects.get_provider_config(self.code, provider)
|
126
|
-
|
127
|
+
|
127
128
|
|
128
129
|
|
129
130
|
class Network(TimestampedModel):
|
@@ -132,47 +133,47 @@ class Network(TimestampedModel):
|
|
132
133
|
|
133
134
|
Represents different networks like Ethereum, Bitcoin, Polygon, etc.
|
134
135
|
"""
|
135
|
-
|
136
|
+
|
136
137
|
name = models.CharField(
|
137
138
|
max_length=50,
|
138
139
|
unique=True,
|
139
140
|
help_text="Network name (e.g., Ethereum, Bitcoin, Polygon)"
|
140
141
|
)
|
141
|
-
|
142
|
+
|
142
143
|
code = models.CharField(
|
143
144
|
max_length=20,
|
144
145
|
unique=True,
|
145
146
|
help_text="Network code (e.g., ETH, BTC, MATIC)"
|
146
147
|
)
|
147
|
-
|
148
|
+
|
148
149
|
native_currency = models.ForeignKey(
|
149
150
|
Currency,
|
150
151
|
on_delete=models.PROTECT,
|
151
152
|
related_name='native_networks',
|
152
153
|
help_text="Native currency of this network"
|
153
154
|
)
|
154
|
-
|
155
|
+
|
155
156
|
block_explorer_url = models.URLField(
|
156
157
|
blank=True,
|
157
158
|
help_text="Block explorer URL template (use {tx} for transaction hash)"
|
158
159
|
)
|
159
|
-
|
160
|
+
|
160
161
|
is_active = models.BooleanField(
|
161
162
|
default=True,
|
162
163
|
help_text="Whether this network is available for payments"
|
163
164
|
)
|
164
|
-
|
165
|
+
|
165
166
|
# Network-specific settings
|
166
167
|
confirmation_blocks = models.PositiveIntegerField(
|
167
168
|
default=1,
|
168
169
|
help_text="Number of confirmations required for this network"
|
169
170
|
)
|
170
|
-
|
171
|
+
|
171
172
|
average_block_time = models.PositiveIntegerField(
|
172
173
|
default=600, # 10 minutes in seconds
|
173
174
|
help_text="Average block time in seconds"
|
174
175
|
)
|
175
|
-
|
176
|
+
|
176
177
|
class Meta:
|
177
178
|
db_table = 'payments_networks'
|
178
179
|
verbose_name = 'Network'
|
@@ -182,15 +183,15 @@ class Network(TimestampedModel):
|
|
182
183
|
models.Index(fields=['is_active']),
|
183
184
|
models.Index(fields=['code']),
|
184
185
|
]
|
185
|
-
|
186
|
+
|
186
187
|
def __str__(self):
|
187
188
|
return f"{self.name} ({self.code})"
|
188
|
-
|
189
|
+
|
189
190
|
def clean(self):
|
190
191
|
"""Validate network data."""
|
191
192
|
if self.code:
|
192
193
|
self.code = self.code.upper()
|
193
|
-
|
194
|
+
|
194
195
|
@property
|
195
196
|
def estimated_confirmation_time(self) -> int:
|
196
197
|
"""Estimated time for confirmations in seconds."""
|
@@ -203,18 +204,18 @@ class ProviderCurrency(TimestampedModel):
|
|
203
204
|
|
204
205
|
Maps currencies to specific providers and networks.
|
205
206
|
"""
|
206
|
-
|
207
|
+
|
207
208
|
provider = models.CharField(
|
208
209
|
max_length=50,
|
209
210
|
help_text="Payment provider name (e.g., nowpayments)"
|
210
211
|
)
|
211
|
-
|
212
|
+
|
212
213
|
currency = models.ForeignKey(
|
213
214
|
Currency,
|
214
215
|
on_delete=models.CASCADE,
|
215
216
|
related_name='provider_configs'
|
216
217
|
)
|
217
|
-
|
218
|
+
|
218
219
|
network = models.ForeignKey(
|
219
220
|
Network,
|
220
221
|
on_delete=models.CASCADE,
|
@@ -223,22 +224,22 @@ class ProviderCurrency(TimestampedModel):
|
|
223
224
|
blank=True,
|
224
225
|
help_text="Network for crypto currencies (null for fiat)"
|
225
226
|
)
|
226
|
-
|
227
|
+
|
227
228
|
# Provider-specific settings
|
228
229
|
provider_currency_code = models.CharField(
|
229
230
|
max_length=20,
|
230
231
|
help_text="Currency code as used by the provider"
|
231
232
|
)
|
232
|
-
|
233
|
+
|
233
234
|
# min_amount and max_amount removed - now provided by provider configuration properties
|
234
|
-
|
235
|
+
|
235
236
|
is_enabled = models.BooleanField(
|
236
237
|
default=True,
|
237
238
|
help_text="Whether this currency is enabled for this provider"
|
238
239
|
)
|
239
|
-
|
240
|
+
|
240
241
|
# Fee configuration removed - now provided by provider configuration properties
|
241
|
-
|
242
|
+
|
242
243
|
class Meta:
|
243
244
|
db_table = 'payments_provider_currencies'
|
244
245
|
verbose_name = 'Provider Currency'
|
@@ -249,29 +250,29 @@ class ProviderCurrency(TimestampedModel):
|
|
249
250
|
models.Index(fields=['provider', 'is_enabled']),
|
250
251
|
models.Index(fields=['currency', 'is_enabled']),
|
251
252
|
]
|
252
|
-
|
253
|
+
|
253
254
|
def __str__(self):
|
254
255
|
network_part = f" ({self.network.code})" if self.network else ""
|
255
256
|
return f"{self.provider}: {self.currency.code}{network_part}"
|
256
|
-
|
257
|
+
|
257
258
|
def clean(self):
|
258
259
|
"""Validate provider currency configuration."""
|
259
260
|
# Crypto currencies must have a network
|
260
261
|
if self.currency and self.currency.is_crypto and not self.network:
|
261
262
|
raise ValidationError("Crypto currencies must specify a network")
|
262
|
-
|
263
|
+
|
263
264
|
# Fiat currencies should not have a network
|
264
265
|
if self.currency and self.currency.is_fiat and self.network:
|
265
266
|
raise ValidationError("Fiat currencies should not specify a network")
|
266
|
-
|
267
|
+
|
267
268
|
# Amount limits validation removed - now handled by provider configuration
|
268
|
-
|
269
|
+
|
269
270
|
@property
|
270
271
|
def display_name(self) -> str:
|
271
272
|
"""Human-readable display name."""
|
272
273
|
network_part = f" on {self.network.name}" if self.network else ""
|
273
274
|
return f"{self.currency.name}{network_part}"
|
274
|
-
|
275
|
+
|
275
276
|
# Provider configuration properties (get values from provider config)
|
276
277
|
@property
|
277
278
|
def provider_fee_percentage(self) -> float:
|
@@ -285,7 +286,7 @@ class ProviderCurrency(TimestampedModel):
|
|
285
286
|
return 0.005 # Default 0.5%
|
286
287
|
except Exception:
|
287
288
|
return 0.005 # Default fallback
|
288
|
-
|
289
|
+
|
289
290
|
@property
|
290
291
|
def provider_fixed_fee_usd(self) -> float:
|
291
292
|
"""Get fixed fee from provider configuration."""
|
@@ -298,7 +299,7 @@ class ProviderCurrency(TimestampedModel):
|
|
298
299
|
return 0.0 # Default no fee
|
299
300
|
except Exception:
|
300
301
|
return 0.0 # Default fallback
|
301
|
-
|
302
|
+
|
302
303
|
@property
|
303
304
|
def provider_min_amount_usd(self) -> float:
|
304
305
|
"""Get minimum amount from provider configuration."""
|
@@ -311,7 +312,7 @@ class ProviderCurrency(TimestampedModel):
|
|
311
312
|
return 0.000001 # Default minimum
|
312
313
|
except Exception:
|
313
314
|
return 0.000001 # Default fallback
|
314
|
-
|
315
|
+
|
315
316
|
@property
|
316
317
|
def provider_max_amount_usd(self) -> float:
|
317
318
|
"""Get maximum amount from provider configuration."""
|
@@ -324,7 +325,7 @@ class ProviderCurrency(TimestampedModel):
|
|
324
325
|
return 1000000.0 # Default maximum
|
325
326
|
except Exception:
|
326
327
|
return 1000000.0 # Default fallback
|
327
|
-
|
328
|
+
|
328
329
|
@property
|
329
330
|
def provider_confirmation_blocks(self) -> int:
|
330
331
|
"""Get confirmation blocks from provider configuration."""
|
@@ -337,7 +338,7 @@ class ProviderCurrency(TimestampedModel):
|
|
337
338
|
return 1 # Default
|
338
339
|
except Exception:
|
339
340
|
return 1 # Default fallback
|
340
|
-
|
341
|
+
|
341
342
|
@property
|
342
343
|
def provider_network_name(self) -> str:
|
343
344
|
"""Get network name from provider configuration."""
|