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
@@ -7,16 +7,16 @@ Enhanced Twilio response management with Material Icons and optimized queries.
|
|
7
7
|
from django.contrib import admin
|
8
8
|
from django.utils.html import format_html
|
9
9
|
from unfold.admin import ModelAdmin
|
10
|
-
from django_cfg import ExportMixin, ExportForm
|
11
10
|
|
11
|
+
from django_cfg import ExportForm, ExportMixin
|
12
12
|
from django_cfg.modules.django_admin import (
|
13
|
-
|
13
|
+
DateTimeDisplayConfig,
|
14
14
|
DisplayMixin,
|
15
|
+
Icons,
|
15
16
|
MoneyDisplayConfig,
|
16
|
-
|
17
|
+
OptimizedModelAdmin,
|
17
18
|
StatusBadgeConfig,
|
18
|
-
|
19
|
-
display
|
19
|
+
display,
|
20
20
|
)
|
21
21
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
22
22
|
|
@@ -31,7 +31,7 @@ class TwilioResponseInline(admin.TabularInline):
|
|
31
31
|
extra = 0
|
32
32
|
readonly_fields = ['created_at', 'status', 'message_sid', 'error_code']
|
33
33
|
fields = ['response_type', 'service_type', 'status', 'message_sid', 'error_code', 'created_at']
|
34
|
-
|
34
|
+
|
35
35
|
def has_add_permission(self, request, obj=None):
|
36
36
|
return False
|
37
37
|
|
@@ -40,14 +40,14 @@ class TwilioResponseInline(admin.TabularInline):
|
|
40
40
|
@admin.register(TwilioResponse)
|
41
41
|
class TwilioResponseAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportMixin):
|
42
42
|
"""Enhanced Twilio Response admin using Django Admin Utilities."""
|
43
|
-
|
43
|
+
|
44
44
|
# Export configuration
|
45
45
|
resource_class = TwilioResponseResource
|
46
46
|
export_form_class = ExportForm
|
47
|
-
|
47
|
+
|
48
48
|
# Performance optimization
|
49
49
|
select_related_fields = ['otp_secret']
|
50
|
-
|
50
|
+
|
51
51
|
list_display = [
|
52
52
|
'identifier_display',
|
53
53
|
'service_type_display',
|
@@ -81,7 +81,7 @@ class TwilioResponseAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportM
|
|
81
81
|
'request_data_display'
|
82
82
|
]
|
83
83
|
ordering = ['-created_at']
|
84
|
-
|
84
|
+
|
85
85
|
fieldsets = (
|
86
86
|
(
|
87
87
|
'Basic Information',
|
@@ -154,25 +154,25 @@ class TwilioResponseAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportM
|
|
154
154
|
},
|
155
155
|
),
|
156
156
|
)
|
157
|
-
|
157
|
+
|
158
158
|
@display(description="Identifier")
|
159
159
|
def identifier_display(self, obj):
|
160
160
|
"""Main identifier display with appropriate icon."""
|
161
161
|
identifier = obj.message_sid or obj.verification_sid
|
162
162
|
if not identifier:
|
163
163
|
return "—"
|
164
|
-
|
164
|
+
|
165
165
|
# Truncate long identifiers
|
166
166
|
if len(identifier) > 20:
|
167
167
|
identifier = f"{identifier[:17]}..."
|
168
|
-
|
168
|
+
|
169
169
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.FINGERPRINT)
|
170
170
|
return StatusBadge.create(
|
171
171
|
text=identifier,
|
172
172
|
variant="info",
|
173
173
|
config=config
|
174
174
|
)
|
175
|
-
|
175
|
+
|
176
176
|
@display(description="Service")
|
177
177
|
def service_type_display(self, obj):
|
178
178
|
"""Service type display with appropriate icon."""
|
@@ -182,16 +182,16 @@ class TwilioResponseAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportM
|
|
182
182
|
'verify': Icons.VERIFIED,
|
183
183
|
'email': Icons.EMAIL,
|
184
184
|
}
|
185
|
-
|
185
|
+
|
186
186
|
icon = service_icons.get(obj.service_type, Icons.CLOUD)
|
187
|
-
|
187
|
+
|
188
188
|
config = StatusBadgeConfig(show_icons=True, icon=icon)
|
189
189
|
return StatusBadge.create(
|
190
190
|
text=obj.get_service_type_display(),
|
191
191
|
variant="primary",
|
192
192
|
config=config
|
193
193
|
)
|
194
|
-
|
194
|
+
|
195
195
|
@display(description="Type")
|
196
196
|
def response_type_display(self, obj):
|
197
197
|
"""Response type display with appropriate icon."""
|
@@ -200,16 +200,16 @@ class TwilioResponseAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportM
|
|
200
200
|
'verify': Icons.VERIFIED,
|
201
201
|
'check': Icons.CHECK_CIRCLE,
|
202
202
|
}
|
203
|
-
|
203
|
+
|
204
204
|
icon = type_icons.get(obj.response_type, Icons.DESCRIPTION)
|
205
|
-
|
205
|
+
|
206
206
|
config = StatusBadgeConfig(show_icons=True, icon=icon)
|
207
207
|
return StatusBadge.create(
|
208
208
|
text=obj.get_response_type_display(),
|
209
209
|
variant="info",
|
210
210
|
config=config
|
211
211
|
)
|
212
|
-
|
212
|
+
|
213
213
|
@display(description="Status", label=True)
|
214
214
|
def status_display(self, obj):
|
215
215
|
"""Enhanced status display with appropriate colors and icons."""
|
@@ -225,25 +225,25 @@ class TwilioResponseAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportM
|
|
225
225
|
status = obj.status or 'Pending'
|
226
226
|
icon = Icons.SCHEDULE
|
227
227
|
variant = "warning"
|
228
|
-
|
228
|
+
|
229
229
|
config = StatusBadgeConfig(
|
230
230
|
show_icons=True,
|
231
231
|
icon=icon,
|
232
232
|
custom_mappings={status: variant}
|
233
233
|
)
|
234
|
-
|
234
|
+
|
235
235
|
return self.display_status_auto(
|
236
236
|
type('obj', (), {'status': status})(),
|
237
237
|
'status',
|
238
238
|
config
|
239
239
|
)
|
240
|
-
|
240
|
+
|
241
241
|
@display(description="Recipient")
|
242
242
|
def recipient_display(self, obj):
|
243
243
|
"""Recipient display with privacy masking."""
|
244
244
|
if not obj.to_number:
|
245
245
|
return "—"
|
246
|
-
|
246
|
+
|
247
247
|
# Mask phone numbers and emails for privacy
|
248
248
|
recipient = obj.to_number
|
249
249
|
if '@' in recipient:
|
@@ -256,72 +256,72 @@ class TwilioResponseAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin, ExportM
|
|
256
256
|
# Phone masking
|
257
257
|
masked_recipient = f"***{recipient[-4:]}" if len(recipient) > 4 else "***"
|
258
258
|
icon = Icons.PHONE
|
259
|
-
|
259
|
+
|
260
260
|
config = StatusBadgeConfig(show_icons=True, icon=icon)
|
261
261
|
return StatusBadge.create(
|
262
262
|
text=masked_recipient,
|
263
263
|
variant="secondary",
|
264
264
|
config=config
|
265
265
|
)
|
266
|
-
|
266
|
+
|
267
267
|
@display(description="Price")
|
268
268
|
def price_display(self, obj):
|
269
269
|
"""Price display with currency formatting."""
|
270
270
|
if not obj.price or not obj.price_unit:
|
271
271
|
return "—"
|
272
|
-
|
272
|
+
|
273
273
|
config = MoneyDisplayConfig(
|
274
274
|
currency=obj.price_unit.upper(),
|
275
275
|
decimal_places=4,
|
276
276
|
show_sign=False
|
277
277
|
)
|
278
|
-
|
278
|
+
|
279
279
|
return self.display_money_amount(
|
280
280
|
type('obj', (), {'price': obj.price})(),
|
281
281
|
'price',
|
282
282
|
config
|
283
283
|
)
|
284
|
-
|
284
|
+
|
285
285
|
@display(description="Created")
|
286
286
|
def created_display(self, obj):
|
287
287
|
"""Created time with relative display."""
|
288
288
|
config = DateTimeDisplayConfig(show_relative=True)
|
289
289
|
return self.display_datetime_relative(obj, 'created_at', config)
|
290
|
-
|
290
|
+
|
291
291
|
@display(description="Error")
|
292
292
|
def error_status_display(self, obj):
|
293
293
|
"""Error status indicator."""
|
294
294
|
if obj.has_error:
|
295
295
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.ERROR)
|
296
296
|
return StatusBadge.create(text="Error", variant="danger", config=config)
|
297
|
-
|
297
|
+
|
298
298
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.CHECK_CIRCLE)
|
299
299
|
return StatusBadge.create(text="OK", variant="success", config=config)
|
300
|
-
|
300
|
+
|
301
301
|
def request_data_display(self, obj):
|
302
302
|
"""Display formatted request data."""
|
303
303
|
if not obj.request_data:
|
304
304
|
return "—"
|
305
|
-
|
305
|
+
|
306
306
|
import json
|
307
307
|
try:
|
308
308
|
formatted = json.dumps(obj.request_data, indent=2, ensure_ascii=False)
|
309
309
|
return format_html('<pre style="font-size: 12px; max-height: 300px; overflow-y: auto;">{}</pre>', formatted)
|
310
310
|
except (TypeError, ValueError):
|
311
311
|
return str(obj.request_data)
|
312
|
-
|
312
|
+
|
313
313
|
request_data_display.short_description = 'Request Data'
|
314
|
-
|
314
|
+
|
315
315
|
def response_data_display(self, obj):
|
316
316
|
"""Display formatted response data."""
|
317
317
|
if not obj.response_data:
|
318
318
|
return "—"
|
319
|
-
|
319
|
+
|
320
320
|
import json
|
321
321
|
try:
|
322
322
|
formatted = json.dumps(obj.response_data, indent=2, ensure_ascii=False)
|
323
323
|
return format_html('<pre style="font-size: 12px; max-height: 300px; overflow-y: auto;">{}</pre>', formatted)
|
324
324
|
except (TypeError, ValueError):
|
325
325
|
return str(obj.response_data)
|
326
|
-
|
326
|
+
|
327
327
|
response_data_display.short_description = 'Response Data'
|
@@ -10,47 +10,51 @@ from django.shortcuts import redirect
|
|
10
10
|
from django.urls import reverse
|
11
11
|
from unfold.admin import ModelAdmin
|
12
12
|
from unfold.forms import AdminPasswordChangeForm, UserChangeForm, UserCreationForm
|
13
|
-
from django_cfg import ImportExportModelAdmin
|
14
13
|
|
14
|
+
from django_cfg import ImportExportModelAdmin
|
15
15
|
from django_cfg.modules.base import BaseCfgModule
|
16
16
|
from django_cfg.modules.django_admin import (
|
17
|
-
|
17
|
+
ActionVariant,
|
18
|
+
DateTimeDisplayConfig,
|
18
19
|
DisplayMixin,
|
20
|
+
Icons,
|
21
|
+
OptimizedModelAdmin,
|
19
22
|
StandaloneActionsMixin,
|
20
|
-
standalone_action,
|
21
|
-
UserDisplayConfig,
|
22
|
-
DateTimeDisplayConfig,
|
23
23
|
StatusBadgeConfig,
|
24
|
-
|
25
|
-
ActionVariant,
|
24
|
+
UserDisplayConfig,
|
26
25
|
display,
|
27
|
-
|
26
|
+
standalone_action,
|
28
27
|
)
|
29
|
-
from django_cfg.modules.django_admin.utils.displays import UserDisplay
|
30
28
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
29
|
+
from django_cfg.modules.django_admin.utils.displays import UserDisplay
|
31
30
|
|
32
31
|
from ..models import CustomUser
|
33
32
|
from .filters import UserStatusFilter
|
34
|
-
from .inlines import
|
33
|
+
from .inlines import (
|
34
|
+
UserActivityInline,
|
35
|
+
UserEmailLogInline,
|
36
|
+
UserRegistrationSourceInline,
|
37
|
+
UserSupportTicketsInline,
|
38
|
+
)
|
35
39
|
from .resources import CustomUserResource
|
36
40
|
|
37
41
|
|
38
42
|
@admin.register(CustomUser)
|
39
43
|
class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, StandaloneActionsMixin, ModelAdmin, ImportExportModelAdmin):
|
40
44
|
"""Enhanced user admin using Django Admin Utilities."""
|
41
|
-
|
45
|
+
|
42
46
|
# Import/Export configuration
|
43
47
|
resource_class = CustomUserResource
|
44
|
-
|
48
|
+
|
45
49
|
# Forms loaded from unfold.forms
|
46
50
|
form = UserChangeForm
|
47
51
|
add_form = UserCreationForm
|
48
52
|
change_password_form = AdminPasswordChangeForm
|
49
|
-
|
53
|
+
|
50
54
|
# Performance optimization
|
51
55
|
select_related_fields = []
|
52
56
|
prefetch_related_fields = ['groups', 'user_permissions']
|
53
|
-
|
57
|
+
|
54
58
|
list_display = [
|
55
59
|
'avatar_display',
|
56
60
|
'email_display',
|
@@ -68,10 +72,10 @@ class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, Standalo
|
|
68
72
|
list_filter = [UserStatusFilter, 'is_staff', 'is_active', 'date_joined']
|
69
73
|
ordering = ['-date_joined']
|
70
74
|
readonly_fields = ['date_joined', 'last_login']
|
71
|
-
|
75
|
+
|
72
76
|
# Register standalone actions
|
73
77
|
actions_list = ['view_user_emails', 'view_user_tickets', 'export_user_data']
|
74
|
-
|
78
|
+
|
75
79
|
fieldsets = (
|
76
80
|
(
|
77
81
|
"Personal Information",
|
@@ -120,11 +124,11 @@ class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, Standalo
|
|
120
124
|
},
|
121
125
|
),
|
122
126
|
)
|
123
|
-
|
127
|
+
|
124
128
|
def get_inlines(self, request, obj):
|
125
129
|
"""Get inlines based on enabled apps."""
|
126
130
|
inlines = [UserRegistrationSourceInline, UserActivityInline]
|
127
|
-
|
131
|
+
|
128
132
|
# Add email log inline if newsletter app is enabled
|
129
133
|
try:
|
130
134
|
base_module = BaseCfgModule()
|
@@ -134,9 +138,9 @@ class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, Standalo
|
|
134
138
|
inlines.append(UserSupportTicketsInline)
|
135
139
|
except Exception:
|
136
140
|
pass
|
137
|
-
|
141
|
+
|
138
142
|
return inlines
|
139
|
-
|
143
|
+
|
140
144
|
@display(description="Avatar", header=True)
|
141
145
|
def avatar_display(self, obj):
|
142
146
|
"""Enhanced avatar display with fallback initials."""
|
@@ -145,7 +149,7 @@ class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, Standalo
|
|
145
149
|
avatar_size=32
|
146
150
|
)
|
147
151
|
return UserDisplay.with_avatar(obj, config)
|
148
|
-
|
152
|
+
|
149
153
|
@display(description="Email")
|
150
154
|
def email_display(self, obj):
|
151
155
|
"""Email display with user icon."""
|
@@ -155,7 +159,7 @@ class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, Standalo
|
|
155
159
|
variant="info",
|
156
160
|
config=config
|
157
161
|
)
|
158
|
-
|
162
|
+
|
159
163
|
@display(description="Full Name")
|
160
164
|
def full_name_display(self, obj):
|
161
165
|
"""Full name display."""
|
@@ -163,10 +167,10 @@ class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, Standalo
|
|
163
167
|
if not full_name:
|
164
168
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.PERSON)
|
165
169
|
return StatusBadge.create(text="No name", variant="secondary", config=config)
|
166
|
-
|
170
|
+
|
167
171
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.PERSON)
|
168
172
|
return StatusBadge.create(text=full_name, variant="primary", config=config)
|
169
|
-
|
173
|
+
|
170
174
|
@display(description="Status", label=True)
|
171
175
|
def status_display(self, obj):
|
172
176
|
"""Enhanced status display with appropriate icons and colors."""
|
@@ -186,7 +190,7 @@ class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, Standalo
|
|
186
190
|
status = "Inactive"
|
187
191
|
icon = Icons.CANCEL
|
188
192
|
variant = "secondary"
|
189
|
-
|
193
|
+
|
190
194
|
config = StatusBadgeConfig(
|
191
195
|
show_icons=True,
|
192
196
|
icon=icon,
|
@@ -197,49 +201,49 @@ class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, Standalo
|
|
197
201
|
'status',
|
198
202
|
config
|
199
203
|
)
|
200
|
-
|
204
|
+
|
201
205
|
@display(description="Sources")
|
202
206
|
def sources_count_display(self, obj):
|
203
207
|
"""Show count of registration sources for user."""
|
204
208
|
count = obj.user_registration_sources.count()
|
205
209
|
if count == 0:
|
206
210
|
return "—"
|
207
|
-
|
211
|
+
|
208
212
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.SOURCE)
|
209
213
|
return StatusBadge.create(
|
210
214
|
text=f"{count} source{'s' if count != 1 else ''}",
|
211
215
|
variant="info",
|
212
216
|
config=config
|
213
217
|
)
|
214
|
-
|
218
|
+
|
215
219
|
@display(description="Activities")
|
216
220
|
def activity_count_display(self, obj):
|
217
221
|
"""Show count of user activities."""
|
218
222
|
count = obj.activities.count()
|
219
223
|
if count == 0:
|
220
224
|
return "—"
|
221
|
-
|
225
|
+
|
222
226
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.HISTORY)
|
223
227
|
return StatusBadge.create(
|
224
228
|
text=f"{count} activit{'ies' if count != 1 else 'y'}",
|
225
229
|
variant="info",
|
226
230
|
config=config
|
227
231
|
)
|
228
|
-
|
232
|
+
|
229
233
|
@display(description="Emails")
|
230
234
|
def emails_count_display(self, obj):
|
231
235
|
"""Show count of emails sent to user (if newsletter app is enabled)."""
|
232
236
|
try:
|
233
237
|
base_module = BaseCfgModule()
|
234
|
-
|
238
|
+
|
235
239
|
if not base_module.is_newsletter_enabled():
|
236
240
|
return "—"
|
237
|
-
|
241
|
+
|
238
242
|
from django_cfg.apps.newsletter.models import EmailLog
|
239
243
|
count = EmailLog.objects.filter(user=obj).count()
|
240
244
|
if count == 0:
|
241
245
|
return "—"
|
242
|
-
|
246
|
+
|
243
247
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.EMAIL)
|
244
248
|
return StatusBadge.create(
|
245
249
|
text=f"{count} email{'s' if count != 1 else ''}",
|
@@ -248,22 +252,22 @@ class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, Standalo
|
|
248
252
|
)
|
249
253
|
except (ImportError, Exception):
|
250
254
|
return "—"
|
251
|
-
|
255
|
+
|
252
256
|
@display(description="Tickets")
|
253
257
|
def tickets_count_display(self, obj):
|
254
258
|
"""Show count of support tickets for user (if support app is enabled)."""
|
255
259
|
try:
|
256
260
|
from django_cfg.modules.base import BaseCfgModule
|
257
261
|
base_module = BaseCfgModule()
|
258
|
-
|
262
|
+
|
259
263
|
if not base_module.is_support_enabled():
|
260
264
|
return "—"
|
261
|
-
|
265
|
+
|
262
266
|
from django_cfg.apps.support.models import Ticket
|
263
267
|
count = Ticket.objects.filter(user=obj).count()
|
264
268
|
if count == 0:
|
265
269
|
return "—"
|
266
|
-
|
270
|
+
|
267
271
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.SUPPORT_AGENT)
|
268
272
|
return StatusBadge.create(
|
269
273
|
text=f"{count} ticket{'s' if count != 1 else ''}",
|
@@ -272,23 +276,23 @@ class CustomUserAdmin(BaseUserAdmin, OptimizedModelAdmin, DisplayMixin, Standalo
|
|
272
276
|
)
|
273
277
|
except (ImportError, Exception):
|
274
278
|
return "—"
|
275
|
-
|
279
|
+
|
276
280
|
@display(description="Last Login")
|
277
281
|
def last_login_display(self, obj):
|
278
282
|
"""Last login with relative time."""
|
279
283
|
if not obj.last_login:
|
280
284
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.LOGIN)
|
281
285
|
return StatusBadge.create(text="Never", variant="secondary", config=config)
|
282
|
-
|
286
|
+
|
283
287
|
config = DateTimeDisplayConfig(show_relative=True)
|
284
288
|
return self.display_datetime_relative(obj, 'last_login', config)
|
285
|
-
|
289
|
+
|
286
290
|
@display(description="Joined")
|
287
291
|
def date_joined_display(self, obj):
|
288
292
|
"""Join date with relative time."""
|
289
293
|
config = DateTimeDisplayConfig(show_relative=True)
|
290
294
|
return self.display_datetime_relative(obj, 'date_joined', config)
|
291
|
-
|
295
|
+
|
292
296
|
# Standalone Actions
|
293
297
|
@standalone_action(
|
294
298
|
description="📧 View Email History",
|
@@ -5,11 +5,11 @@ Management command to test OTP functionality.
|
|
5
5
|
from django.core.management.base import BaseCommand, CommandError
|
6
6
|
from django.utils import timezone
|
7
7
|
from rich.console import Console
|
8
|
-
from rich.table import Table
|
9
8
|
from rich.panel import Panel
|
9
|
+
from rich.table import Table
|
10
10
|
|
11
|
+
from ...models import OTPSecret
|
11
12
|
from ...services.otp_service import OTPService
|
12
|
-
from ...models import CustomUser, OTPSecret
|
13
13
|
|
14
14
|
|
15
15
|
class Command(BaseCommand):
|
@@ -50,11 +50,11 @@ class Command(BaseCommand):
|
|
50
50
|
|
51
51
|
def handle(self, *args, **options):
|
52
52
|
"""Handle the command execution."""
|
53
|
-
|
53
|
+
|
54
54
|
if options['stats']:
|
55
55
|
self.show_stats()
|
56
56
|
return
|
57
|
-
|
57
|
+
|
58
58
|
if options['cleanup']:
|
59
59
|
self.cleanup_expired()
|
60
60
|
return
|
@@ -88,18 +88,18 @@ class Command(BaseCommand):
|
|
88
88
|
|
89
89
|
if success:
|
90
90
|
self.console.print("[green]✅ OTP request successful![/green]")
|
91
|
-
|
91
|
+
|
92
92
|
# Show the generated OTP for testing
|
93
93
|
otp = OTPSecret.objects.filter(
|
94
94
|
email=email.lower().strip(),
|
95
95
|
is_used=False,
|
96
96
|
expires_at__gt=timezone.now()
|
97
97
|
).first()
|
98
|
-
|
98
|
+
|
99
99
|
if otp:
|
100
100
|
self.console.print(f"[yellow]🔑 Generated OTP: {otp.secret}[/yellow]")
|
101
101
|
self.console.print(f"[dim]Expires at: {otp.expires_at}[/dim]")
|
102
|
-
|
102
|
+
|
103
103
|
else:
|
104
104
|
self.console.print(f"[red]❌ OTP request failed: {error_type}[/red]")
|
105
105
|
|
@@ -143,7 +143,7 @@ class Command(BaseCommand):
|
|
143
143
|
|
144
144
|
try:
|
145
145
|
stats = OTPService.get_otp_stats()
|
146
|
-
|
146
|
+
|
147
147
|
table = Table(show_header=True, header_style="bold magenta")
|
148
148
|
table.add_column("Metric", style="cyan")
|
149
149
|
table.add_column("Count", justify="right", style="green")
|
@@ -193,11 +193,11 @@ class Command(BaseCommand):
|
|
193
193
|
is_used=False,
|
194
194
|
expires_at__lte=now
|
195
195
|
)
|
196
|
-
|
196
|
+
|
197
197
|
count = expired_otps.count()
|
198
198
|
expired_otps.delete()
|
199
|
-
|
199
|
+
|
200
200
|
self.console.print(f"[green]✅ Cleaned up {count} expired OTPs[/green]")
|
201
201
|
|
202
202
|
except Exception as e:
|
203
|
-
self.console.print(f"[red]❌ Error during cleanup: {str(e)}[/red]")
|
203
|
+
self.console.print(f"[red]❌ Error during cleanup: {str(e)}[/red]")
|
@@ -1 +1 @@
|
|
1
|
-
# Managers package for user account functionality
|
1
|
+
# Managers package for user account functionality
|
@@ -1,13 +1,12 @@
|
|
1
|
-
from django.contrib.auth.models import UserManager
|
2
|
-
from django.contrib.auth.hashers import make_password
|
3
|
-
from django.utils import timezone
|
4
|
-
from urllib.parse import urlparse
|
5
|
-
import random
|
6
|
-
import string
|
7
1
|
import logging
|
2
|
+
import random
|
3
|
+
import re
|
8
4
|
import traceback
|
5
|
+
from urllib.parse import urlparse
|
6
|
+
|
9
7
|
from coolname import generate_slug
|
10
|
-
import
|
8
|
+
from django.contrib.auth.models import UserManager
|
9
|
+
from django.utils import timezone
|
11
10
|
|
12
11
|
logger = logging.getLogger(__name__)
|
13
12
|
|
@@ -3,11 +3,12 @@
|
|
3
3
|
import django.contrib.auth.validators
|
4
4
|
import django.db.models.deletion
|
5
5
|
import django.utils.timezone
|
6
|
-
import django_cfg.apps.accounts.managers.user_manager
|
7
|
-
import django_cfg.apps.accounts.models
|
8
6
|
from django.conf import settings
|
9
7
|
from django.db import migrations, models
|
10
8
|
|
9
|
+
import django_cfg.apps.accounts.managers.user_manager
|
10
|
+
import django_cfg.apps.accounts.models
|
11
|
+
|
11
12
|
|
12
13
|
class Migration(migrations.Migration):
|
13
14
|
|
@@ -13,6 +13,11 @@ Models are organized by functionality:
|
|
13
13
|
"""
|
14
14
|
|
15
15
|
# Import base utilities
|
16
|
+
# Import activity models
|
17
|
+
from .activity import UserActivity
|
18
|
+
|
19
|
+
# Import authentication models
|
20
|
+
from .auth import OTPSecret
|
16
21
|
from .base import user_avatar_path
|
17
22
|
|
18
23
|
# Import choices
|
@@ -22,8 +27,8 @@ from .choices import (
|
|
22
27
|
TwilioServiceType,
|
23
28
|
)
|
24
29
|
|
25
|
-
# Import
|
26
|
-
from .
|
30
|
+
# Import integration models
|
31
|
+
from .integrations import TwilioResponse
|
27
32
|
|
28
33
|
# Import registration models
|
29
34
|
from .registration import (
|
@@ -31,38 +36,32 @@ from .registration import (
|
|
31
36
|
UserRegistrationSource,
|
32
37
|
)
|
33
38
|
|
34
|
-
# Import
|
35
|
-
from .
|
36
|
-
|
37
|
-
# Import activity models
|
38
|
-
from .activity import UserActivity
|
39
|
-
|
40
|
-
# Import integration models
|
41
|
-
from .integrations import TwilioResponse
|
39
|
+
# Import user models
|
40
|
+
from .user import CustomUser
|
42
41
|
|
43
42
|
# Export all models
|
44
43
|
__all__ = [
|
45
44
|
# Base utilities
|
46
45
|
'user_avatar_path',
|
47
|
-
|
46
|
+
|
48
47
|
# Choices
|
49
48
|
'ActivityType',
|
50
49
|
'TwilioResponseType',
|
51
50
|
'TwilioServiceType',
|
52
|
-
|
51
|
+
|
53
52
|
# User models
|
54
53
|
'CustomUser',
|
55
|
-
|
54
|
+
|
56
55
|
# Registration models
|
57
56
|
'RegistrationSource',
|
58
57
|
'UserRegistrationSource',
|
59
|
-
|
58
|
+
|
60
59
|
# Authentication models
|
61
60
|
'OTPSecret',
|
62
|
-
|
61
|
+
|
63
62
|
# Activity models
|
64
63
|
'UserActivity',
|
65
|
-
|
64
|
+
|
66
65
|
# Integration models
|
67
66
|
'TwilioResponse',
|
68
67
|
]
|