django-cfg 1.4.20__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/migrations/0003_alter_documentarchive_archive_type.py +29 -0
- 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 +35 -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 +36 -35
- 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 +12 -13
- 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.20.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.20.dist-info/RECORD +0 -1110
- /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.20.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -4,14 +4,19 @@ Subscription serializers for the Universal Payment System v2.0.
|
|
4
4
|
DRF serializers for subscription operations with service integration.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from
|
8
|
-
|
7
|
+
from typing import Any, Dict
|
8
|
+
|
9
9
|
from django.contrib.auth import get_user_model
|
10
|
+
from rest_framework import serializers
|
10
11
|
|
11
|
-
from ...models import Subscription, EndpointGroup, Tariff
|
12
|
-
from ...services import get_subscription_service, SubscriptionCreateRequest, SubscriptionUpdateRequest
|
13
12
|
from django_cfg.modules.django_logging import get_logger
|
14
13
|
|
14
|
+
from ...models import EndpointGroup, Subscription, Tariff
|
15
|
+
from ...services import (
|
16
|
+
SubscriptionCreateRequest,
|
17
|
+
get_subscription_service,
|
18
|
+
)
|
19
|
+
|
15
20
|
User = get_user_model()
|
16
21
|
logger = get_logger("subscription_serializers")
|
17
22
|
|
@@ -22,7 +27,7 @@ class EndpointGroupSerializer(serializers.ModelSerializer):
|
|
22
27
|
|
23
28
|
Used for subscription endpoint group configuration.
|
24
29
|
"""
|
25
|
-
|
30
|
+
|
26
31
|
class Meta:
|
27
32
|
model = EndpointGroup
|
28
33
|
fields = [
|
@@ -42,10 +47,10 @@ class TariffSerializer(serializers.ModelSerializer):
|
|
42
47
|
|
43
48
|
Used for tariff information and selection.
|
44
49
|
"""
|
45
|
-
|
50
|
+
|
46
51
|
endpoint_groups = EndpointGroupSerializer(many=True, read_only=True)
|
47
52
|
endpoint_groups_count = serializers.IntegerField(source='endpoint_groups.count', read_only=True)
|
48
|
-
|
53
|
+
|
49
54
|
class Meta:
|
50
55
|
model = Tariff
|
51
56
|
fields = [
|
@@ -70,11 +75,11 @@ class SubscriptionListSerializer(serializers.ModelSerializer):
|
|
70
75
|
|
71
76
|
Optimized for subscription lists with minimal data.
|
72
77
|
"""
|
73
|
-
|
78
|
+
|
74
79
|
user = serializers.StringRelatedField(read_only=True)
|
75
80
|
tariff_name = serializers.CharField(source='tariff.name', read_only=True)
|
76
81
|
status_display = serializers.CharField(source='get_status_display', read_only=True)
|
77
|
-
|
82
|
+
|
78
83
|
class Meta:
|
79
84
|
model = Subscription
|
80
85
|
fields = [
|
@@ -97,14 +102,14 @@ class SubscriptionSerializer(serializers.ModelSerializer):
|
|
97
102
|
|
98
103
|
Used for subscription detail views and updates.
|
99
104
|
"""
|
100
|
-
|
105
|
+
|
101
106
|
user = serializers.StringRelatedField(read_only=True)
|
102
107
|
tariff = TariffSerializer(read_only=True)
|
103
108
|
endpoint_group = EndpointGroupSerializer(read_only=True)
|
104
109
|
status_display = serializers.CharField(source='get_status_display', read_only=True)
|
105
|
-
|
110
|
+
|
106
111
|
# Only keep fields that actually exist or are needed
|
107
|
-
|
112
|
+
|
108
113
|
class Meta:
|
109
114
|
model = Subscription
|
110
115
|
fields = [
|
@@ -146,7 +151,7 @@ class SubscriptionCreateSerializer(serializers.Serializer):
|
|
146
151
|
|
147
152
|
Validates input and delegates to SubscriptionService.
|
148
153
|
"""
|
149
|
-
|
154
|
+
|
150
155
|
tariff_id = serializers.IntegerField(
|
151
156
|
min_value=1,
|
152
157
|
help_text="Tariff ID for the subscription"
|
@@ -163,64 +168,64 @@ class SubscriptionCreateSerializer(serializers.Serializer):
|
|
163
168
|
max_value=365,
|
164
169
|
help_text="Subscription duration in days"
|
165
170
|
)
|
166
|
-
|
171
|
+
|
167
172
|
def validate_tariff_id(self, value: int) -> int:
|
168
173
|
"""Validate tariff exists and is active."""
|
169
174
|
if not Tariff.objects.filter(id=value, is_active=True).exists():
|
170
175
|
raise serializers.ValidationError(f"Tariff {value} not found or inactive")
|
171
176
|
return value
|
172
|
-
|
177
|
+
|
173
178
|
def validate_endpoint_group_id(self, value: int) -> int:
|
174
179
|
"""Validate endpoint group exists and is active."""
|
175
180
|
if value and not EndpointGroup.objects.filter(id=value, is_active=True).exists():
|
176
181
|
raise serializers.ValidationError(f"Endpoint group {value} not found or inactive")
|
177
182
|
return value
|
178
|
-
|
183
|
+
|
179
184
|
def validate(self, attrs: Dict[str, Any]) -> Dict[str, Any]:
|
180
185
|
"""Validate subscription creation data."""
|
181
186
|
try:
|
182
187
|
# Get user from context
|
183
188
|
user_id = self.context.get('user_pk') or self.context['request'].user.id
|
184
|
-
|
189
|
+
|
185
190
|
# Create Pydantic request for validation
|
186
191
|
request = SubscriptionCreateRequest(
|
187
192
|
user_id=user_id,
|
188
193
|
**attrs
|
189
194
|
)
|
190
|
-
|
195
|
+
|
191
196
|
# Store validated request for create method
|
192
197
|
self._validated_request = request
|
193
198
|
return attrs
|
194
|
-
|
199
|
+
|
195
200
|
except Exception as e:
|
196
201
|
logger.error(f"Subscription validation failed: {e}")
|
197
202
|
raise serializers.ValidationError(f"Invalid subscription data: {e}")
|
198
|
-
|
203
|
+
|
199
204
|
def create(self, validated_data: Dict[str, Any]) -> Subscription:
|
200
205
|
"""Create subscription using SubscriptionService."""
|
201
206
|
try:
|
202
207
|
subscription_service = get_subscription_service()
|
203
208
|
result = subscription_service.create_subscription(self._validated_request)
|
204
|
-
|
209
|
+
|
205
210
|
if result.success:
|
206
211
|
# Get the created subscription from database
|
207
212
|
subscription = Subscription.objects.get(id=result.subscription_id)
|
208
|
-
|
209
|
-
logger.info(
|
213
|
+
|
214
|
+
logger.info("Subscription created successfully", extra={
|
210
215
|
'subscription_id': result.subscription_id,
|
211
216
|
'user_id': self._validated_request.user_id,
|
212
217
|
'tariff_id': self._validated_request.tariff_id
|
213
218
|
})
|
214
|
-
|
219
|
+
|
215
220
|
return subscription
|
216
221
|
else:
|
217
222
|
logger.error(f"Subscription creation failed: {result.message}")
|
218
223
|
raise serializers.ValidationError(result.message)
|
219
|
-
|
224
|
+
|
220
225
|
except Exception as e:
|
221
226
|
logger.error(f"Subscription creation error: {e}")
|
222
227
|
raise serializers.ValidationError(f"Subscription creation failed: {e}")
|
223
|
-
|
228
|
+
|
224
229
|
def to_representation(self, instance: Subscription) -> Dict[str, Any]:
|
225
230
|
"""Return full subscription data after creation."""
|
226
231
|
return SubscriptionSerializer(instance, context=self.context).data
|
@@ -232,7 +237,7 @@ class SubscriptionUpdateSerializer(serializers.Serializer):
|
|
232
237
|
|
233
238
|
Handles subscription modifications through SubscriptionService.
|
234
239
|
"""
|
235
|
-
|
240
|
+
|
236
241
|
action = serializers.ChoiceField(
|
237
242
|
choices=[
|
238
243
|
('activate', 'Activate'),
|
@@ -254,29 +259,29 @@ class SubscriptionUpdateSerializer(serializers.Serializer):
|
|
254
259
|
max_value=365,
|
255
260
|
help_text="Duration for renewal (required for renew action)"
|
256
261
|
)
|
257
|
-
|
262
|
+
|
258
263
|
def validate(self, attrs: Dict[str, Any]) -> Dict[str, Any]:
|
259
264
|
"""Validate subscription update data."""
|
260
265
|
action = attrs.get('action')
|
261
266
|
duration_days = attrs.get('duration_days')
|
262
|
-
|
267
|
+
|
263
268
|
if action == 'renew' and not duration_days:
|
264
269
|
raise serializers.ValidationError("duration_days is required for renew action")
|
265
|
-
|
270
|
+
|
266
271
|
return attrs
|
267
|
-
|
272
|
+
|
268
273
|
def save(self) -> Dict[str, Any]:
|
269
274
|
"""Update subscription using SubscriptionService."""
|
270
275
|
try:
|
271
276
|
subscription_id = self.context.get('subscription_id')
|
272
277
|
if not subscription_id:
|
273
278
|
raise serializers.ValidationError("Subscription ID is required")
|
274
|
-
|
279
|
+
|
275
280
|
subscription_service = get_subscription_service()
|
276
281
|
action = self.validated_data['action']
|
277
282
|
reason = self.validated_data.get('reason')
|
278
283
|
duration_days = self.validated_data.get('duration_days')
|
279
|
-
|
284
|
+
|
280
285
|
# Call appropriate service method based on action
|
281
286
|
if action == 'activate':
|
282
287
|
result = subscription_service.activate_subscription(subscription_id)
|
@@ -288,11 +293,11 @@ class SubscriptionUpdateSerializer(serializers.Serializer):
|
|
288
293
|
result = subscription_service.renew_subscription(subscription_id, duration_days)
|
289
294
|
else:
|
290
295
|
raise serializers.ValidationError(f"Unknown action: {action}")
|
291
|
-
|
296
|
+
|
292
297
|
if result.success:
|
293
298
|
# Get updated subscription
|
294
299
|
subscription = Subscription.objects.get(id=result.subscription_id)
|
295
|
-
|
300
|
+
|
296
301
|
return {
|
297
302
|
'success': True,
|
298
303
|
'message': result.message,
|
@@ -304,7 +309,7 @@ class SubscriptionUpdateSerializer(serializers.Serializer):
|
|
304
309
|
'error': result.message,
|
305
310
|
'error_code': result.error_code
|
306
311
|
}
|
307
|
-
|
312
|
+
|
308
313
|
except Exception as e:
|
309
314
|
logger.error(f"Subscription update error: {e}")
|
310
315
|
return {
|
@@ -320,27 +325,27 @@ class SubscriptionUsageSerializer(serializers.Serializer):
|
|
320
325
|
|
321
326
|
Used for incrementing usage counters.
|
322
327
|
"""
|
323
|
-
|
328
|
+
|
324
329
|
endpoint = serializers.CharField(
|
325
330
|
required=False,
|
326
331
|
allow_blank=True,
|
327
332
|
max_length=200,
|
328
333
|
help_text="API endpoint used"
|
329
334
|
)
|
330
|
-
|
335
|
+
|
331
336
|
def save(self) -> Dict[str, Any]:
|
332
337
|
"""Increment subscription usage using SubscriptionService."""
|
333
338
|
try:
|
334
339
|
subscription_id = self.context.get('subscription_id')
|
335
340
|
if not subscription_id:
|
336
341
|
raise serializers.ValidationError("Subscription ID is required")
|
337
|
-
|
342
|
+
|
338
343
|
subscription_service = get_subscription_service()
|
339
344
|
result = subscription_service.increment_usage(
|
340
345
|
subscription_id=subscription_id,
|
341
346
|
endpoint=self.validated_data.get('endpoint')
|
342
347
|
)
|
343
|
-
|
348
|
+
|
344
349
|
if result.success:
|
345
350
|
return {
|
346
351
|
'success': True,
|
@@ -353,7 +358,7 @@ class SubscriptionUsageSerializer(serializers.Serializer):
|
|
353
358
|
'error': result.message,
|
354
359
|
'error_code': result.error_code
|
355
360
|
}
|
356
|
-
|
361
|
+
|
357
362
|
except Exception as e:
|
358
363
|
logger.error(f"Usage increment error: {e}")
|
359
364
|
return {
|
@@ -369,14 +374,14 @@ class SubscriptionStatsSerializer(serializers.Serializer):
|
|
369
374
|
|
370
375
|
Used for subscription analytics and reporting.
|
371
376
|
"""
|
372
|
-
|
377
|
+
|
373
378
|
days = serializers.IntegerField(
|
374
379
|
default=30,
|
375
380
|
min_value=1,
|
376
381
|
max_value=365,
|
377
382
|
help_text="Number of days to analyze"
|
378
383
|
)
|
379
|
-
|
384
|
+
|
380
385
|
def save(self) -> Dict[str, Any]:
|
381
386
|
"""Get subscription statistics using SubscriptionService."""
|
382
387
|
try:
|
@@ -384,7 +389,7 @@ class SubscriptionStatsSerializer(serializers.Serializer):
|
|
384
389
|
result = subscription_service.get_subscription_stats(
|
385
390
|
days=self.validated_data['days']
|
386
391
|
)
|
387
|
-
|
392
|
+
|
388
393
|
if result.success:
|
389
394
|
return {
|
390
395
|
'success': True,
|
@@ -397,7 +402,7 @@ class SubscriptionStatsSerializer(serializers.Serializer):
|
|
397
402
|
'error': result.message,
|
398
403
|
'error_code': result.error_code
|
399
404
|
}
|
400
|
-
|
405
|
+
|
401
406
|
except Exception as e:
|
402
407
|
logger.error(f"Subscription stats error: {e}")
|
403
408
|
return {
|
@@ -5,6 +5,7 @@ DRF serializers for webhook endpoints and data validation.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from rest_framework import serializers
|
8
|
+
|
8
9
|
from django_cfg.modules.django_logging import get_logger
|
9
10
|
|
10
11
|
logger = get_logger(__name__)
|
@@ -16,11 +17,11 @@ class WebhookSerializer(serializers.Serializer):
|
|
16
17
|
|
17
18
|
Base serializer for all webhook types.
|
18
19
|
"""
|
19
|
-
|
20
|
+
|
20
21
|
provider = serializers.CharField(max_length=50, help_text="Payment provider name")
|
21
22
|
success = serializers.BooleanField(help_text="Processing success status")
|
22
23
|
message = serializers.CharField(max_length=500, help_text="Processing message")
|
23
|
-
|
24
|
+
|
24
25
|
class Meta:
|
25
26
|
fields = ['provider', 'success', 'message']
|
26
27
|
|
@@ -31,7 +32,7 @@ class WebhookDataSerializer(serializers.Serializer):
|
|
31
32
|
|
32
33
|
Generic webhook data structure for all providers.
|
33
34
|
"""
|
34
|
-
|
35
|
+
|
35
36
|
provider = serializers.CharField(max_length=50, help_text="Payment provider name")
|
36
37
|
payment_id = serializers.CharField(max_length=256, help_text="Provider payment ID")
|
37
38
|
status = serializers.CharField(max_length=50, help_text="Payment status")
|
@@ -39,13 +40,13 @@ class WebhookDataSerializer(serializers.Serializer):
|
|
39
40
|
currency = serializers.CharField(max_length=10, required=False, help_text="Payment currency")
|
40
41
|
transaction_hash = serializers.CharField(max_length=256, required=False, help_text="Blockchain transaction hash")
|
41
42
|
confirmations = serializers.IntegerField(required=False, help_text="Number of confirmations")
|
42
|
-
|
43
|
+
|
43
44
|
# Raw webhook data
|
44
45
|
raw_data = serializers.JSONField(help_text="Raw webhook payload")
|
45
|
-
|
46
|
+
|
46
47
|
class Meta:
|
47
48
|
fields = [
|
48
|
-
'provider', 'payment_id', 'status', 'amount',
|
49
|
+
'provider', 'payment_id', 'status', 'amount',
|
49
50
|
'currency', 'transaction_hash', 'confirmations', 'raw_data'
|
50
51
|
]
|
51
52
|
|
@@ -56,13 +57,13 @@ class WebhookResponseSerializer(serializers.Serializer):
|
|
56
57
|
|
57
58
|
Standard response format for all webhook endpoints.
|
58
59
|
"""
|
59
|
-
|
60
|
+
|
60
61
|
success = serializers.BooleanField(help_text="Whether webhook was processed successfully")
|
61
62
|
message = serializers.CharField(max_length=500, help_text="Processing result message")
|
62
63
|
payment_id = serializers.CharField(max_length=256, required=False, help_text="Internal payment ID")
|
63
64
|
provider_payment_id = serializers.CharField(max_length=256, required=False, help_text="Provider payment ID")
|
64
65
|
processed_at = serializers.DateTimeField(required=False, help_text="Processing timestamp")
|
65
|
-
|
66
|
+
|
66
67
|
class Meta:
|
67
68
|
fields = ['success', 'message', 'payment_id', 'provider_payment_id', 'processed_at']
|
68
69
|
|
@@ -71,11 +72,11 @@ class WebhookHealthSerializer(serializers.Serializer):
|
|
71
72
|
"""
|
72
73
|
Serializer for webhook health check response.
|
73
74
|
"""
|
74
|
-
|
75
|
+
|
75
76
|
status = serializers.CharField(max_length=20, help_text="Health status")
|
76
77
|
timestamp = serializers.DateTimeField(help_text="Check timestamp")
|
77
78
|
providers = serializers.JSONField(help_text="Provider health status")
|
78
|
-
|
79
|
+
|
79
80
|
class Meta:
|
80
81
|
fields = ['status', 'timestamp', 'providers']
|
81
82
|
|
@@ -84,13 +85,13 @@ class WebhookStatsSerializer(serializers.Serializer):
|
|
84
85
|
"""
|
85
86
|
Serializer for webhook statistics response.
|
86
87
|
"""
|
87
|
-
|
88
|
+
|
88
89
|
total_webhooks = serializers.IntegerField(help_text="Total webhooks processed")
|
89
90
|
successful_webhooks = serializers.IntegerField(help_text="Successfully processed webhooks")
|
90
91
|
failed_webhooks = serializers.IntegerField(help_text="Failed webhook processing attempts")
|
91
92
|
success_rate = serializers.FloatField(help_text="Success rate percentage")
|
92
93
|
providers = serializers.JSONField(help_text="Per-provider statistics")
|
93
|
-
|
94
|
+
|
94
95
|
class Meta:
|
95
96
|
fields = ['total_webhooks', 'successful_webhooks', 'failed_webhooks', 'success_rate', 'providers']
|
96
97
|
|
@@ -99,12 +100,12 @@ class SupportedProvidersSerializer(serializers.Serializer):
|
|
99
100
|
"""
|
100
101
|
Serializer for supported providers response.
|
101
102
|
"""
|
102
|
-
|
103
|
+
|
103
104
|
success = serializers.BooleanField(help_text="Request success status")
|
104
105
|
providers = serializers.JSONField(help_text="List of supported providers")
|
105
106
|
total_count = serializers.IntegerField(help_text="Total number of providers")
|
106
107
|
timestamp = serializers.DateTimeField(help_text="Response timestamp")
|
107
|
-
|
108
|
+
|
108
109
|
class Meta:
|
109
110
|
fields = ['success', 'providers', 'total_count', 'timestamp']
|
110
111
|
|
@@ -115,7 +116,7 @@ class NowPaymentsWebhookSerializer(serializers.Serializer):
|
|
115
116
|
|
116
117
|
Specific to NowPayments IPN format.
|
117
118
|
"""
|
118
|
-
|
119
|
+
|
119
120
|
payment_id = serializers.CharField(max_length=256, help_text="NowPayments payment ID")
|
120
121
|
payment_status = serializers.CharField(max_length=50, help_text="Payment status")
|
121
122
|
pay_address = serializers.CharField(max_length=256, required=False, help_text="Payment address")
|
@@ -128,7 +129,7 @@ class NowPaymentsWebhookSerializer(serializers.Serializer):
|
|
128
129
|
purchase_id = serializers.CharField(max_length=256, required=False, help_text="Purchase ID")
|
129
130
|
outcome_amount = serializers.DecimalField(max_digits=20, decimal_places=8, required=False, help_text="Outcome amount")
|
130
131
|
outcome_currency = serializers.CharField(max_length=10, required=False, help_text="Outcome currency")
|
131
|
-
|
132
|
+
|
132
133
|
class Meta:
|
133
134
|
fields = [
|
134
135
|
'payment_id', 'payment_status', 'pay_address', 'price_amount', 'price_currency',
|
@@ -4,9 +4,9 @@ Support admin interfaces using Django-CFG admin system.
|
|
4
4
|
Refactored admin interfaces with Material Icons and optimized queries.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from .
|
8
|
-
from .
|
9
|
-
from .
|
7
|
+
from .filters import MessageSenderEmailFilter, TicketUserEmailFilter, TicketUserNameFilter
|
8
|
+
from .resources import MessageResource, TicketResource
|
9
|
+
from .support_admin import MessageAdmin, TicketAdmin
|
10
10
|
|
11
11
|
__all__ = [
|
12
12
|
'TicketAdmin',
|
@@ -2,58 +2,58 @@
|
|
2
2
|
Import/Export resources for Support app.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from import_export import resources, fields
|
6
|
-
from import_export.widgets import ForeignKeyWidget, DateTimeWidget, BooleanWidget
|
7
5
|
from django.contrib.auth import get_user_model
|
6
|
+
from import_export import fields, resources
|
7
|
+
from import_export.widgets import BooleanWidget, DateTimeWidget
|
8
8
|
|
9
|
-
from ..models import
|
9
|
+
from ..models import Message, Ticket
|
10
10
|
|
11
11
|
User = get_user_model()
|
12
12
|
|
13
13
|
|
14
14
|
class TicketResource(resources.ModelResource):
|
15
15
|
"""Resource for exporting tickets (export only)."""
|
16
|
-
|
16
|
+
|
17
17
|
user_email = fields.Field(
|
18
18
|
column_name='user_email',
|
19
19
|
attribute='user__email',
|
20
20
|
readonly=True
|
21
21
|
)
|
22
|
-
|
22
|
+
|
23
23
|
user_full_name = fields.Field(
|
24
24
|
column_name='user_full_name',
|
25
25
|
attribute='user__get_full_name',
|
26
26
|
readonly=True
|
27
27
|
)
|
28
|
-
|
28
|
+
|
29
29
|
status_display = fields.Field(
|
30
30
|
column_name='status_display',
|
31
31
|
attribute='get_status_display',
|
32
32
|
readonly=True
|
33
33
|
)
|
34
|
-
|
34
|
+
|
35
35
|
messages_count = fields.Field(
|
36
36
|
column_name='messages_count',
|
37
37
|
readonly=True
|
38
38
|
)
|
39
|
-
|
39
|
+
|
40
40
|
last_message_text = fields.Field(
|
41
41
|
column_name='last_message_text',
|
42
42
|
readonly=True
|
43
43
|
)
|
44
|
-
|
44
|
+
|
45
45
|
last_message_at = fields.Field(
|
46
46
|
column_name='last_message_at',
|
47
47
|
readonly=True,
|
48
48
|
widget=DateTimeWidget(format='%Y-%m-%d %H:%M:%S')
|
49
49
|
)
|
50
|
-
|
50
|
+
|
51
51
|
unanswered_messages_count = fields.Field(
|
52
52
|
column_name='unanswered_messages_count',
|
53
53
|
attribute='unanswered_messages_count',
|
54
54
|
readonly=True
|
55
55
|
)
|
56
|
-
|
56
|
+
|
57
57
|
created_at = fields.Field(
|
58
58
|
column_name='created_at',
|
59
59
|
attribute='created_at',
|
@@ -77,11 +77,11 @@ class TicketResource(resources.ModelResource):
|
|
77
77
|
)
|
78
78
|
export_order = fields
|
79
79
|
# No import - this is export only
|
80
|
-
|
80
|
+
|
81
81
|
def dehydrate_messages_count(self, ticket):
|
82
82
|
"""Calculate messages count for export."""
|
83
83
|
return ticket.messages.count()
|
84
|
-
|
84
|
+
|
85
85
|
def dehydrate_last_message_text(self, ticket):
|
86
86
|
"""Get last message text for export."""
|
87
87
|
last_message = ticket.last_message
|
@@ -90,12 +90,12 @@ class TicketResource(resources.ModelResource):
|
|
90
90
|
text = last_message.text
|
91
91
|
return text[:100] + '...' if len(text) > 100 else text
|
92
92
|
return ''
|
93
|
-
|
93
|
+
|
94
94
|
def dehydrate_last_message_at(self, ticket):
|
95
95
|
"""Get last message timestamp for export."""
|
96
96
|
last_message = ticket.last_message
|
97
97
|
return last_message.created_at if last_message else None
|
98
|
-
|
98
|
+
|
99
99
|
def get_queryset(self):
|
100
100
|
"""Optimize queryset for export."""
|
101
101
|
return super().get_queryset().select_related('user').prefetch_related('messages')
|
@@ -103,49 +103,49 @@ class TicketResource(resources.ModelResource):
|
|
103
103
|
|
104
104
|
class MessageResource(resources.ModelResource):
|
105
105
|
"""Resource for exporting messages (export only)."""
|
106
|
-
|
106
|
+
|
107
107
|
ticket_uuid = fields.Field(
|
108
108
|
column_name='ticket_uuid',
|
109
109
|
attribute='ticket__uuid',
|
110
110
|
readonly=True
|
111
111
|
)
|
112
|
-
|
112
|
+
|
113
113
|
ticket_subject = fields.Field(
|
114
114
|
column_name='ticket_subject',
|
115
115
|
attribute='ticket__subject',
|
116
116
|
readonly=True
|
117
117
|
)
|
118
|
-
|
118
|
+
|
119
119
|
sender_email = fields.Field(
|
120
120
|
column_name='sender_email',
|
121
121
|
attribute='sender__email',
|
122
122
|
readonly=True
|
123
123
|
)
|
124
|
-
|
124
|
+
|
125
125
|
sender_full_name = fields.Field(
|
126
126
|
column_name='sender_full_name',
|
127
127
|
attribute='sender__get_full_name',
|
128
128
|
readonly=True
|
129
129
|
)
|
130
|
-
|
130
|
+
|
131
131
|
is_from_author = fields.Field(
|
132
132
|
column_name='is_from_author',
|
133
133
|
attribute='is_from_author',
|
134
134
|
widget=BooleanWidget(),
|
135
135
|
readonly=True
|
136
136
|
)
|
137
|
-
|
137
|
+
|
138
138
|
is_from_staff = fields.Field(
|
139
139
|
column_name='is_from_staff',
|
140
140
|
readonly=True,
|
141
141
|
widget=BooleanWidget()
|
142
142
|
)
|
143
|
-
|
143
|
+
|
144
144
|
text_preview = fields.Field(
|
145
145
|
column_name='text_preview',
|
146
146
|
readonly=True
|
147
147
|
)
|
148
|
-
|
148
|
+
|
149
149
|
created_at = fields.Field(
|
150
150
|
column_name='created_at',
|
151
151
|
attribute='created_at',
|
@@ -168,16 +168,16 @@ class MessageResource(resources.ModelResource):
|
|
168
168
|
)
|
169
169
|
export_order = fields
|
170
170
|
# No import - this is export only
|
171
|
-
|
171
|
+
|
172
172
|
def dehydrate_is_from_staff(self, message):
|
173
173
|
"""Check if message is from staff member."""
|
174
174
|
return message.sender.is_staff
|
175
|
-
|
175
|
+
|
176
176
|
def dehydrate_text_preview(self, message):
|
177
177
|
"""Get truncated text preview for export."""
|
178
178
|
text = message.text
|
179
179
|
return text[:200] + '...' if len(text) > 200 else text
|
180
|
-
|
180
|
+
|
181
181
|
def get_queryset(self):
|
182
182
|
"""Optimize queryset for export."""
|
183
183
|
return super().get_queryset().select_related('ticket', 'sender')
|