django-cfg 1.4.21__py3-none-any.whl → 1.4.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +36 -7
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/METADATA +1 -1
- django_cfg-1.4.24.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/licenses/LICENSE +0 -0
@@ -5,22 +5,21 @@ Clean subscription management with plan icons and status tracking.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from django.contrib import admin
|
8
|
-
from django.db.models import Count
|
9
8
|
from unfold.admin import ModelAdmin
|
10
9
|
|
11
10
|
from django_cfg.modules.django_admin import (
|
12
|
-
|
11
|
+
ActionVariant,
|
13
12
|
DisplayMixin,
|
13
|
+
Icons,
|
14
14
|
MoneyDisplayConfig,
|
15
|
+
OptimizedModelAdmin,
|
15
16
|
StatusBadgeConfig,
|
16
|
-
|
17
|
-
Icons,
|
18
|
-
ActionVariant,
|
17
|
+
action,
|
19
18
|
display,
|
20
|
-
action
|
21
19
|
)
|
22
20
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
23
21
|
from django_cfg.modules.django_logging import get_logger
|
22
|
+
|
24
23
|
from ..models import Subscription
|
25
24
|
|
26
25
|
logger = get_logger("subscriptions_admin")
|
@@ -29,9 +28,9 @@ logger = get_logger("subscriptions_admin")
|
|
29
28
|
@admin.register(Subscription)
|
30
29
|
class SubscriptionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
31
30
|
"""Subscription admin using Django Admin Utilities with plan icons."""
|
32
|
-
|
31
|
+
|
33
32
|
select_related_fields = ['user']
|
34
|
-
|
33
|
+
|
35
34
|
list_display = [
|
36
35
|
'user_display',
|
37
36
|
'plan_display',
|
@@ -39,52 +38,52 @@ class SubscriptionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
39
38
|
'status_display',
|
40
39
|
'expires_display'
|
41
40
|
]
|
42
|
-
|
41
|
+
|
43
42
|
list_filter = ['status', 'tier', 'created_at']
|
44
43
|
search_fields = ['user__username', 'user__email']
|
45
44
|
readonly_fields = ['created_at', 'updated_at']
|
46
|
-
|
45
|
+
|
47
46
|
# Register actions
|
48
47
|
actions = ['activate_subscriptions', 'cancel_subscriptions', 'extend_trial']
|
49
|
-
|
48
|
+
|
50
49
|
@display(description="User", header=True)
|
51
50
|
def user_display(self, obj):
|
52
51
|
"""User display with avatar."""
|
53
52
|
return self.display_user_with_avatar(obj, 'user')
|
54
|
-
|
53
|
+
|
55
54
|
@display(description="Plan")
|
56
55
|
def plan_display(self, obj):
|
57
56
|
"""Plan display with tier-specific icons."""
|
58
57
|
# Plan type to icon and variant mapping
|
59
58
|
plan_config = {
|
60
59
|
'basic': {'variant': 'secondary', 'icon': Icons.PERSON},
|
61
|
-
'premium': {'variant': 'primary', 'icon': Icons.STAR},
|
60
|
+
'premium': {'variant': 'primary', 'icon': Icons.STAR},
|
62
61
|
'enterprise': {'variant': 'success', 'icon': Icons.BUSINESS},
|
63
62
|
'pro': {'variant': 'info', 'icon': Icons.WORKSPACE_PREMIUM},
|
64
63
|
}
|
65
|
-
|
64
|
+
|
66
65
|
tier = getattr(obj, 'tier', '').lower()
|
67
66
|
config_data = plan_config.get(tier, {'variant': 'info', 'icon': Icons.SUBSCRIPTIONS})
|
68
|
-
|
67
|
+
|
69
68
|
tier_name = obj.get_tier_display() if hasattr(obj, 'get_tier_display') else obj.tier.title()
|
70
|
-
|
69
|
+
|
71
70
|
badge_config = StatusBadgeConfig(
|
72
71
|
show_icons=True,
|
73
72
|
icon=config_data['icon']
|
74
73
|
)
|
75
|
-
|
74
|
+
|
76
75
|
return StatusBadge.create(
|
77
76
|
text=tier_name,
|
78
77
|
variant=config_data['variant'],
|
79
78
|
config=badge_config
|
80
79
|
)
|
81
|
-
|
80
|
+
|
82
81
|
@display(description="Amount")
|
83
82
|
def amount_display(self, obj):
|
84
83
|
"""Amount display with currency."""
|
85
84
|
config = MoneyDisplayConfig(currency="USD", show_sign=False)
|
86
85
|
return self.display_money_amount(obj, 'monthly_cost_usd', config)
|
87
|
-
|
86
|
+
|
88
87
|
@display(description="Status", label=True)
|
89
88
|
def status_display(self, obj):
|
90
89
|
"""Status display with subscription-specific icons."""
|
@@ -95,7 +94,7 @@ class SubscriptionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
95
94
|
'pending': 'warning',
|
96
95
|
'trial': 'info'
|
97
96
|
}
|
98
|
-
|
97
|
+
|
99
98
|
# Status-specific icons
|
100
99
|
status_icons = {
|
101
100
|
'active': Icons.CHECK_CIRCLE,
|
@@ -104,55 +103,54 @@ class SubscriptionAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
104
103
|
'pending': Icons.PENDING,
|
105
104
|
'trial': Icons.TIMER
|
106
105
|
}
|
107
|
-
|
106
|
+
|
108
107
|
status = getattr(obj, 'status', 'unknown').lower()
|
109
108
|
icon = status_icons.get(status, Icons.HELP)
|
110
|
-
|
109
|
+
|
111
110
|
config = StatusBadgeConfig(
|
112
111
|
custom_mappings=subscription_mappings,
|
113
112
|
show_icons=True,
|
114
113
|
icon=icon
|
115
114
|
)
|
116
|
-
|
115
|
+
|
117
116
|
return self.display_status_auto(obj, 'status', config)
|
118
|
-
|
117
|
+
|
119
118
|
@display(description="Expires")
|
120
119
|
def expires_display(self, obj):
|
121
120
|
"""Expiry date display."""
|
122
121
|
if not hasattr(obj, 'expires_at') or not obj.expires_at:
|
123
122
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.ALL_INCLUSIVE)
|
124
123
|
return StatusBadge.create(text="No Expiry", variant="info", config=config)
|
125
|
-
|
124
|
+
|
126
125
|
return self.display_datetime_relative(obj, 'expires_at')
|
127
|
-
|
126
|
+
|
128
127
|
@action(description="Activate subscriptions", variant=ActionVariant.SUCCESS)
|
129
128
|
def activate_subscriptions(self, request, queryset):
|
130
129
|
"""Activate selected subscriptions."""
|
131
130
|
updated = queryset.update(status='active')
|
132
131
|
self.message_user(request, f"Activated {updated} subscription(s).", level='SUCCESS')
|
133
|
-
|
132
|
+
|
134
133
|
@action(description="Cancel subscriptions", variant=ActionVariant.WARNING)
|
135
134
|
def cancel_subscriptions(self, request, queryset):
|
136
135
|
"""Cancel selected subscriptions."""
|
137
136
|
updated = queryset.update(status='cancelled')
|
138
137
|
self.message_user(request, f"Cancelled {updated} subscription(s).", level='WARNING')
|
139
|
-
|
138
|
+
|
140
139
|
@action(description="Extend trial period", variant=ActionVariant.INFO)
|
141
140
|
def extend_trial(self, request, queryset):
|
142
141
|
"""Extend trial period for selected subscriptions."""
|
143
|
-
from django.utils import timezone
|
144
142
|
from datetime import timedelta
|
145
|
-
|
143
|
+
|
146
144
|
trial_subs = queryset.filter(status='trial')
|
147
145
|
updated_count = 0
|
148
|
-
|
146
|
+
|
149
147
|
for sub in trial_subs:
|
150
148
|
if hasattr(sub, 'expires_at') and sub.expires_at:
|
151
149
|
# Extend by 7 days
|
152
150
|
sub.expires_at = sub.expires_at + timedelta(days=7)
|
153
151
|
sub.save()
|
154
152
|
updated_count += 1
|
155
|
-
|
153
|
+
|
156
154
|
self.message_user(
|
157
155
|
request,
|
158
156
|
f"Extended trial period for {updated_count} subscription(s).",
|
@@ -4,24 +4,19 @@ Tariffs Admin interface using Django Admin Utilities.
|
|
4
4
|
Clean tariff management with pricing and limits display.
|
5
5
|
"""
|
6
6
|
|
7
|
+
|
7
8
|
from django.contrib import admin
|
8
|
-
from django.db.models import Count, Q
|
9
|
-
from django.utils import timezone
|
10
9
|
from django.utils.html import format_html
|
11
|
-
from datetime import timedelta
|
12
|
-
|
13
10
|
from unfold.admin import ModelAdmin
|
14
11
|
|
15
12
|
from django_cfg.modules.django_admin import (
|
16
|
-
|
13
|
+
DateTimeDisplayConfig,
|
17
14
|
DisplayMixin,
|
15
|
+
Icons,
|
18
16
|
MoneyDisplayConfig,
|
19
|
-
|
17
|
+
OptimizedModelAdmin,
|
20
18
|
StatusBadgeConfig,
|
21
|
-
Icons,
|
22
|
-
ActionVariant,
|
23
19
|
display,
|
24
|
-
action
|
25
20
|
)
|
26
21
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
27
22
|
|
@@ -40,11 +35,11 @@ class TariffAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
40
35
|
- Automatic query optimization
|
41
36
|
- Type-safe configuration
|
42
37
|
"""
|
43
|
-
|
38
|
+
|
44
39
|
# Performance optimization
|
45
40
|
select_related_fields = []
|
46
41
|
annotations = {}
|
47
|
-
|
42
|
+
|
48
43
|
# List configuration
|
49
44
|
list_display = [
|
50
45
|
'name_display',
|
@@ -55,7 +50,7 @@ class TariffAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
55
50
|
'status_display',
|
56
51
|
'created_at_display'
|
57
52
|
]
|
58
|
-
|
53
|
+
|
59
54
|
list_filter = [
|
60
55
|
'is_active',
|
61
56
|
'is_public',
|
@@ -63,69 +58,69 @@ class TariffAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
63
58
|
'priority_support',
|
64
59
|
'created_at'
|
65
60
|
]
|
66
|
-
|
61
|
+
|
67
62
|
search_fields = ['name', 'code', 'description']
|
68
|
-
|
63
|
+
|
69
64
|
readonly_fields = [
|
70
65
|
'created_at',
|
71
66
|
'updated_at',
|
72
67
|
'yearly_discount_percentage'
|
73
68
|
]
|
74
|
-
|
69
|
+
|
75
70
|
# Display methods using Unfold features
|
76
71
|
@display(description="Name", ordering="name")
|
77
72
|
def name_display(self, obj):
|
78
73
|
"""Tariff name display."""
|
79
74
|
return obj.name
|
80
|
-
|
75
|
+
|
81
76
|
@display(description="Code", ordering="code")
|
82
77
|
def code_display(self, obj):
|
83
78
|
"""Tariff code display."""
|
84
79
|
return obj.code
|
85
|
-
|
80
|
+
|
86
81
|
@display(description="Pricing", ordering="monthly_price_usd")
|
87
82
|
def pricing_display(self, obj):
|
88
83
|
"""Pricing display using utilities."""
|
89
84
|
monthly = self.display_money_amount(
|
90
|
-
obj,
|
85
|
+
obj,
|
91
86
|
'monthly_price_usd',
|
92
87
|
MoneyDisplayConfig(currency="USD", show_sign=False)
|
93
88
|
)
|
94
|
-
|
89
|
+
|
95
90
|
if obj.yearly_price_usd:
|
96
91
|
yearly = self.display_money_amount(
|
97
92
|
obj,
|
98
|
-
'yearly_price_usd',
|
93
|
+
'yearly_price_usd',
|
99
94
|
MoneyDisplayConfig(currency="USD", show_sign=False)
|
100
95
|
)
|
101
96
|
discount = f"{obj.yearly_discount_percentage:.0f}% off"
|
102
97
|
return format_html("{}/mo • {}/yr ({})", monthly, yearly, discount)
|
103
|
-
|
98
|
+
|
104
99
|
return format_html("{}/mo", monthly)
|
105
|
-
|
100
|
+
|
106
101
|
@display(description="Rate Limits")
|
107
102
|
def rate_limits_display(self, obj):
|
108
103
|
"""Rate limits display."""
|
109
104
|
return f"{obj.requests_per_hour:,}/hr • {obj.requests_per_day:,}/day • {obj.requests_per_month:,}/mo"
|
110
|
-
|
105
|
+
|
111
106
|
@display(description="Features")
|
112
107
|
def features_display(self, obj):
|
113
108
|
"""Features display."""
|
114
109
|
features = []
|
115
|
-
|
110
|
+
|
116
111
|
features.append(f"{obj.max_api_keys} API keys")
|
117
|
-
|
112
|
+
|
118
113
|
if obj.supports_webhooks:
|
119
114
|
features.append("Webhooks")
|
120
|
-
|
115
|
+
|
121
116
|
if obj.priority_support:
|
122
117
|
features.append("Priority Support")
|
123
|
-
|
118
|
+
|
124
119
|
return " • ".join(features)
|
125
|
-
|
120
|
+
|
126
121
|
@display(description="Status", label={
|
127
122
|
"Active": "success",
|
128
|
-
"Private": "warning",
|
123
|
+
"Private": "warning",
|
129
124
|
"Inactive": "danger"
|
130
125
|
})
|
131
126
|
def status_display(self, obj):
|
@@ -136,7 +131,7 @@ class TariffAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
136
131
|
return "Private"
|
137
132
|
else:
|
138
133
|
return "Inactive"
|
139
|
-
|
134
|
+
|
140
135
|
@display(description="Created")
|
141
136
|
def created_at_display(self, obj):
|
142
137
|
"""Created at display."""
|
@@ -157,11 +152,11 @@ class TariffEndpointGroupAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
157
152
|
- Custom rate limit display
|
158
153
|
- Clean utilities integration
|
159
154
|
"""
|
160
|
-
|
155
|
+
|
161
156
|
# Performance optimization
|
162
157
|
select_related_fields = ['tariff', 'endpoint_group']
|
163
158
|
annotations = {}
|
164
|
-
|
159
|
+
|
165
160
|
# List configuration
|
166
161
|
list_display = [
|
167
162
|
'tariff_display',
|
@@ -170,24 +165,24 @@ class TariffEndpointGroupAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
170
165
|
'status_display',
|
171
166
|
'created_at_display'
|
172
167
|
]
|
173
|
-
|
168
|
+
|
174
169
|
list_filter = [
|
175
170
|
'is_enabled',
|
176
171
|
'tariff__is_active',
|
177
172
|
'created_at'
|
178
173
|
]
|
179
|
-
|
174
|
+
|
180
175
|
search_fields = [
|
181
176
|
'tariff__name',
|
182
177
|
'endpoint_group__name'
|
183
178
|
]
|
184
|
-
|
179
|
+
|
185
180
|
readonly_fields = [
|
186
181
|
'created_at',
|
187
182
|
'updated_at',
|
188
183
|
'effective_rate_limit'
|
189
184
|
]
|
190
|
-
|
185
|
+
|
191
186
|
# Display methods
|
192
187
|
@display(description="Tariff")
|
193
188
|
def tariff_display(self, obj):
|
@@ -198,7 +193,7 @@ class TariffEndpointGroupAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
198
193
|
variant="primary",
|
199
194
|
config=config
|
200
195
|
)
|
201
|
-
|
196
|
+
|
202
197
|
@display(description="Endpoint Group")
|
203
198
|
def endpoint_group_display(self, obj):
|
204
199
|
"""Endpoint group display."""
|
@@ -208,17 +203,17 @@ class TariffEndpointGroupAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
208
203
|
variant="info",
|
209
204
|
config=config
|
210
205
|
)
|
211
|
-
|
206
|
+
|
212
207
|
@display(description="Rate Limit")
|
213
208
|
def rate_limit_display(self, obj):
|
214
209
|
"""Rate limit display."""
|
215
210
|
effective = obj.effective_rate_limit
|
216
|
-
|
211
|
+
|
217
212
|
if obj.custom_rate_limit:
|
218
213
|
return f"{effective:,}/hr (custom)"
|
219
214
|
else:
|
220
215
|
return f"{effective:,}/hr (default)"
|
221
|
-
|
216
|
+
|
222
217
|
@display(description="Status")
|
223
218
|
def status_display(self, obj):
|
224
219
|
"""Status display."""
|
@@ -230,14 +225,14 @@ class TariffEndpointGroupAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
230
225
|
status = "Disabled"
|
231
226
|
variant = "danger"
|
232
227
|
icon = Icons.CANCEL
|
233
|
-
|
228
|
+
|
234
229
|
config = StatusBadgeConfig(show_icons=True, icon=icon)
|
235
230
|
return StatusBadge.create(
|
236
231
|
text=status,
|
237
232
|
variant=variant,
|
238
233
|
config=config
|
239
234
|
)
|
240
|
-
|
235
|
+
|
241
236
|
@display(description="Created")
|
242
237
|
def created_at_display(self, obj):
|
243
238
|
"""Created at display."""
|
@@ -4,21 +4,20 @@ Admin Interface Serializers for Universal Payment System v2.0.
|
|
4
4
|
DRF serializers for admin dashboard API endpoints.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from .webhook_serializers import (
|
8
|
-
WebhookEventSerializer,
|
9
|
-
WebhookEventListSerializer,
|
10
|
-
WebhookStatsSerializer,
|
11
|
-
WebhookActionSerializer,
|
12
|
-
WebhookActionResultSerializer,
|
13
|
-
)
|
14
|
-
|
15
7
|
from .payment_serializers import (
|
16
|
-
AdminUserSerializer,
|
17
|
-
AdminPaymentListSerializer,
|
18
|
-
AdminPaymentDetailSerializer,
|
19
8
|
AdminPaymentCreateSerializer,
|
20
|
-
|
9
|
+
AdminPaymentDetailSerializer,
|
10
|
+
AdminPaymentListSerializer,
|
21
11
|
AdminPaymentStatsSerializer,
|
12
|
+
AdminPaymentUpdateSerializer,
|
13
|
+
AdminUserSerializer,
|
14
|
+
)
|
15
|
+
from .webhook_serializers import (
|
16
|
+
WebhookActionResultSerializer,
|
17
|
+
WebhookActionSerializer,
|
18
|
+
WebhookEventListSerializer,
|
19
|
+
WebhookEventSerializer,
|
20
|
+
WebhookStatsSerializer,
|
22
21
|
)
|
23
22
|
|
24
23
|
__all__ = [
|
@@ -28,7 +27,7 @@ __all__ = [
|
|
28
27
|
'WebhookStatsSerializer',
|
29
28
|
'WebhookActionSerializer',
|
30
29
|
'WebhookActionResultSerializer',
|
31
|
-
|
30
|
+
|
32
31
|
# Payment serializers
|
33
32
|
'AdminUserSerializer',
|
34
33
|
'AdminPaymentListSerializer',
|
@@ -4,9 +4,9 @@ Payment Serializers for Admin Interface.
|
|
4
4
|
DRF serializers for payment management in admin dashboard.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from rest_framework import serializers
|
8
7
|
from django.contrib.auth import get_user_model
|
9
8
|
from django.contrib.humanize.templatetags.humanize import naturaltime
|
9
|
+
from rest_framework import serializers
|
10
10
|
|
11
11
|
from ...models import UniversalPayment
|
12
12
|
|
@@ -29,6 +29,7 @@ class AdminPaymentListSerializer(serializers.Serializer):
|
|
29
29
|
Uses UniversalPayment only for data extraction.
|
30
30
|
"""
|
31
31
|
id = serializers.UUIDField(read_only=True)
|
32
|
+
internal_payment_id = serializers.CharField(read_only=True)
|
32
33
|
user = AdminUserSerializer(read_only=True)
|
33
34
|
amount_usd = serializers.FloatField(read_only=True)
|
34
35
|
currency_code = serializers.SerializerMethodField()
|
@@ -44,23 +45,23 @@ class AdminPaymentListSerializer(serializers.Serializer):
|
|
44
45
|
updated_at = serializers.DateTimeField(read_only=True)
|
45
46
|
description = serializers.CharField(read_only=True)
|
46
47
|
age = serializers.SerializerMethodField()
|
47
|
-
|
48
|
+
|
48
49
|
def get_currency_code(self, obj):
|
49
50
|
"""Get currency code from related Currency model."""
|
50
51
|
return obj.currency.code if obj.currency else None
|
51
|
-
|
52
|
+
|
52
53
|
def get_currency_name(self, obj):
|
53
54
|
"""Get currency name from related Currency model."""
|
54
55
|
return obj.currency.name if obj.currency else None
|
55
|
-
|
56
|
+
|
56
57
|
def get_provider_display(self, obj):
|
57
58
|
"""Get human-readable provider name."""
|
58
59
|
return obj.get_provider_display()
|
59
|
-
|
60
|
+
|
60
61
|
def get_status_display(self, obj):
|
61
62
|
"""Get human-readable status."""
|
62
63
|
return obj.get_status_display()
|
63
|
-
|
64
|
+
|
64
65
|
def get_age(self, obj):
|
65
66
|
"""Get human-readable age of payment."""
|
66
67
|
from django.contrib.humanize.templatetags.humanize import naturaltime
|
@@ -101,23 +102,23 @@ class AdminPaymentDetailSerializer(serializers.Serializer):
|
|
101
102
|
created_at = serializers.DateTimeField(read_only=True)
|
102
103
|
updated_at = serializers.DateTimeField(read_only=True)
|
103
104
|
age = serializers.SerializerMethodField()
|
104
|
-
|
105
|
+
|
105
106
|
def get_currency_code(self, obj):
|
106
107
|
"""Get currency code from related Currency model."""
|
107
108
|
return obj.currency.code if obj.currency else None
|
108
|
-
|
109
|
+
|
109
110
|
def get_currency_name(self, obj):
|
110
111
|
"""Get currency name from related Currency model."""
|
111
112
|
return obj.currency.name if obj.currency else None
|
112
|
-
|
113
|
+
|
113
114
|
def get_provider_display(self, obj):
|
114
115
|
"""Get human-readable provider name."""
|
115
116
|
return obj.get_provider_display()
|
116
|
-
|
117
|
+
|
117
118
|
def get_status_display(self, obj):
|
118
119
|
"""Get human-readable status."""
|
119
120
|
return obj.get_status_display()
|
120
|
-
|
121
|
+
|
121
122
|
def get_age(self, obj):
|
122
123
|
"""Get human-readable age of payment."""
|
123
124
|
return naturaltime(obj.created_at)
|
@@ -135,7 +136,7 @@ class AdminPaymentCreateSerializer(serializers.Serializer):
|
|
135
136
|
description = serializers.CharField(required=False, allow_blank=True)
|
136
137
|
callback_url = serializers.URLField(required=False, allow_blank=True)
|
137
138
|
cancel_url = serializers.URLField(required=False, allow_blank=True)
|
138
|
-
|
139
|
+
|
139
140
|
def validate_amount_usd(self, value):
|
140
141
|
"""Validate USD amount."""
|
141
142
|
if value <= 0:
|
@@ -143,16 +144,16 @@ class AdminPaymentCreateSerializer(serializers.Serializer):
|
|
143
144
|
if value > 100000: # Max $100k per payment
|
144
145
|
raise serializers.ValidationError("Amount exceeds maximum limit")
|
145
146
|
return value
|
146
|
-
|
147
|
+
|
147
148
|
def create(self, validated_data):
|
148
149
|
"""Create payment using PaymentService for proper provider integration."""
|
150
|
+
from django_cfg.apps.payments.models import ProviderCurrency
|
149
151
|
from django_cfg.apps.payments.services.core.payment_service import PaymentService
|
150
152
|
from django_cfg.apps.payments.services.types.requests import PaymentCreateRequest
|
151
|
-
|
152
|
-
|
153
|
+
|
153
154
|
# Extract provider_currency_code and find original currency
|
154
155
|
provider_currency_code = validated_data.pop('currency_code')
|
155
|
-
|
156
|
+
|
156
157
|
# Find the ProviderCurrency to get original currency code
|
157
158
|
try:
|
158
159
|
provider_currency = ProviderCurrency.objects.select_related('currency').get(
|
@@ -163,7 +164,7 @@ class AdminPaymentCreateSerializer(serializers.Serializer):
|
|
163
164
|
original_currency_code = provider_currency.currency.code
|
164
165
|
except ProviderCurrency.DoesNotExist:
|
165
166
|
raise serializers.ValidationError(f"Provider currency {provider_currency_code} not found for {validated_data['provider']}")
|
166
|
-
|
167
|
+
|
167
168
|
# Create PaymentCreateRequest for the service
|
168
169
|
payment_request = PaymentCreateRequest(
|
169
170
|
user_id=validated_data['user'].id,
|
@@ -175,11 +176,11 @@ class AdminPaymentCreateSerializer(serializers.Serializer):
|
|
175
176
|
cancel_url=validated_data.get('cancel_url', ''),
|
176
177
|
metadata={'provider_currency_code': provider_currency_code} # Store provider code in metadata
|
177
178
|
)
|
178
|
-
|
179
|
+
|
179
180
|
# Use PaymentService to create payment with provider integration
|
180
181
|
payment_service = PaymentService()
|
181
182
|
result = payment_service.create_payment(payment_request)
|
182
|
-
|
183
|
+
|
183
184
|
if result.success:
|
184
185
|
# Get the created payment object from database using payment_id
|
185
186
|
from django_cfg.apps.payments.models import UniversalPayment
|
@@ -187,7 +188,7 @@ class AdminPaymentCreateSerializer(serializers.Serializer):
|
|
187
188
|
return payment
|
188
189
|
else:
|
189
190
|
raise serializers.ValidationError(f"Payment creation failed: {result.message}")
|
190
|
-
|
191
|
+
|
191
192
|
def to_representation(self, instance):
|
192
193
|
"""Return created payment with ID and currency info."""
|
193
194
|
if instance:
|
@@ -218,14 +219,14 @@ class AdminPaymentUpdateSerializer(serializers.ModelSerializer):
|
|
218
219
|
'status', 'description', 'callback_url', 'cancel_url',
|
219
220
|
'provider_data', 'webhook_data'
|
220
221
|
]
|
221
|
-
|
222
|
+
|
222
223
|
def validate_status(self, value):
|
223
224
|
"""Validate status transitions."""
|
224
225
|
if self.instance and self.instance.status == UniversalPayment.PaymentStatus.COMPLETED:
|
225
226
|
if value != UniversalPayment.PaymentStatus.COMPLETED:
|
226
227
|
raise serializers.ValidationError("Cannot change status of completed payment")
|
227
228
|
return value
|
228
|
-
|
229
|
+
|
229
230
|
|
230
231
|
|
231
232
|
class AdminPaymentStatsSerializer(serializers.Serializer):
|
@@ -238,30 +239,30 @@ class AdminPaymentStatsSerializer(serializers.Serializer):
|
|
238
239
|
failed_payments = serializers.IntegerField()
|
239
240
|
pending_payments = serializers.IntegerField()
|
240
241
|
success_rate = serializers.FloatField()
|
241
|
-
|
242
|
+
|
242
243
|
# Provider breakdown
|
243
244
|
by_provider = serializers.DictField(
|
244
245
|
child=serializers.DictField(),
|
245
246
|
help_text="Statistics by provider"
|
246
247
|
)
|
247
|
-
|
248
|
+
|
248
249
|
# Currency breakdown
|
249
250
|
by_currency = serializers.DictField(
|
250
251
|
child=serializers.DictField(),
|
251
252
|
help_text="Statistics by currency"
|
252
253
|
)
|
253
|
-
|
254
|
+
|
254
255
|
# Time-based stats
|
255
256
|
last_24h = serializers.DictField(
|
256
257
|
child=serializers.IntegerField(),
|
257
258
|
help_text="Payments in last 24 hours"
|
258
259
|
)
|
259
|
-
|
260
|
+
|
260
261
|
last_7d = serializers.DictField(
|
261
262
|
child=serializers.IntegerField(),
|
262
263
|
help_text="Payments in last 7 days"
|
263
264
|
)
|
264
|
-
|
265
|
+
|
265
266
|
last_30d = serializers.DictField(
|
266
267
|
child=serializers.IntegerField(),
|
267
268
|
help_text="Payments in last 30 days"
|
@@ -4,9 +4,8 @@ Webhook Serializers for Admin Interface.
|
|
4
4
|
DRF serializers for webhook management in admin dashboard.
|
5
5
|
"""
|
6
6
|
|
7
|
+
|
7
8
|
from rest_framework import serializers
|
8
|
-
from datetime import datetime
|
9
|
-
from typing import Dict, Any
|
10
9
|
|
11
10
|
|
12
11
|
class WebhookEventSerializer(serializers.Serializer):
|
@@ -64,19 +63,19 @@ class WebhookStatsSerializer(serializers.Serializer):
|
|
64
63
|
failed = serializers.IntegerField()
|
65
64
|
pending = serializers.IntegerField()
|
66
65
|
success_rate = serializers.FloatField()
|
67
|
-
|
66
|
+
|
68
67
|
# Provider breakdown
|
69
68
|
providers = serializers.DictField(
|
70
69
|
child=WebhookProviderStatsSerializer(),
|
71
70
|
help_text="Statistics by provider"
|
72
71
|
)
|
73
|
-
|
72
|
+
|
74
73
|
# Time-based stats
|
75
74
|
last_24h = serializers.DictField(
|
76
75
|
child=serializers.IntegerField(),
|
77
76
|
help_text="Events in last 24 hours"
|
78
77
|
)
|
79
|
-
|
78
|
+
|
80
79
|
# Performance metrics
|
81
80
|
avg_response_time = serializers.FloatField()
|
82
81
|
max_response_time = serializers.IntegerField()
|