django-cfg 1.4.21__py3-none-any.whl → 1.4.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
django_cfg/__init__.py
CHANGED
@@ -36,8 +36,8 @@ __version__ = "1.4.4"
|
|
36
36
|
__license__ = "MIT"
|
37
37
|
|
38
38
|
# Import registry for organized lazy loading
|
39
|
-
from .registry import DJANGO_CFG_REGISTRY
|
40
39
|
from .config import LIB_NAME
|
40
|
+
from .registry import DJANGO_CFG_REGISTRY
|
41
41
|
|
42
42
|
# Get author from library config
|
43
43
|
__author__ = LIB_NAME
|
@@ -47,13 +47,13 @@ def __getattr__(name: str):
|
|
47
47
|
"""Lazy import mechanism using registry pattern."""
|
48
48
|
if name in DJANGO_CFG_REGISTRY:
|
49
49
|
module_path, class_name = DJANGO_CFG_REGISTRY[name]
|
50
|
-
|
50
|
+
|
51
51
|
import importlib
|
52
52
|
module = importlib.import_module(module_path)
|
53
53
|
return getattr(module, class_name)
|
54
|
-
|
54
|
+
|
55
55
|
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
|
56
56
|
|
57
57
|
|
58
58
|
# Export all registered components
|
59
|
-
__all__ = list(DJANGO_CFG_REGISTRY.keys())
|
59
|
+
__all__ = list(DJANGO_CFG_REGISTRY.keys())
|
@@ -1,12 +1,13 @@
|
|
1
|
-
from typing import Optional, List
|
2
|
-
from django.contrib.auth.models import AbstractUser
|
3
|
-
from django.db import models
|
4
|
-
from django.utils import timezone
|
5
|
-
from datetime import timedelta
|
6
1
|
import random
|
7
2
|
import string
|
3
|
+
from datetime import timedelta
|
4
|
+
from typing import List, Optional
|
8
5
|
from urllib.parse import urlparse
|
9
6
|
|
7
|
+
from django.contrib.auth.models import AbstractUser
|
8
|
+
from django.db import models
|
9
|
+
from django.utils import timezone
|
10
|
+
|
10
11
|
from .managers.user_manager import UserManager
|
11
12
|
|
12
13
|
|
@@ -52,7 +53,7 @@ class UserRegistrationSource(models.Model):
|
|
52
53
|
source = models.ForeignKey(RegistrationSource, on_delete=models.CASCADE, related_name='user_registration_sources')
|
53
54
|
first_registration = models.BooleanField(default=True, help_text="Whether this was the first registration from this source")
|
54
55
|
registration_date = models.DateTimeField(auto_now_add=True)
|
55
|
-
|
56
|
+
|
56
57
|
class Meta:
|
57
58
|
app_label = 'django_cfg_accounts'
|
58
59
|
unique_together = ['user', 'source']
|
@@ -170,7 +171,7 @@ class UserActivity(models.Model):
|
|
170
171
|
"""
|
171
172
|
User activity log.
|
172
173
|
"""
|
173
|
-
|
174
|
+
|
174
175
|
ACTIVITY_TYPES = [
|
175
176
|
('login', 'Login'),
|
176
177
|
('logout', 'Logout'),
|
@@ -179,39 +180,39 @@ class UserActivity(models.Model):
|
|
179
180
|
('profile_updated', 'Profile Updated'),
|
180
181
|
('registration', 'Registration'),
|
181
182
|
]
|
182
|
-
|
183
|
+
|
183
184
|
user = models.ForeignKey('CustomUser', on_delete=models.CASCADE, related_name='activities')
|
184
185
|
activity_type = models.CharField(max_length=20, choices=ACTIVITY_TYPES)
|
185
186
|
description = models.TextField(blank=True)
|
186
187
|
ip_address = models.GenericIPAddressField(null=True, blank=True)
|
187
188
|
user_agent = models.TextField(blank=True)
|
188
|
-
|
189
|
+
|
189
190
|
# Related objects (generic foreign key could be used here)
|
190
191
|
object_id = models.PositiveIntegerField(null=True, blank=True)
|
191
192
|
object_type = models.CharField(max_length=50, blank=True)
|
192
|
-
|
193
|
+
|
193
194
|
created_at = models.DateTimeField(auto_now_add=True)
|
194
|
-
|
195
|
+
|
195
196
|
class Meta:
|
196
197
|
app_label = 'django_cfg_accounts'
|
197
198
|
verbose_name = 'User Activity'
|
198
199
|
verbose_name_plural = 'User Activities'
|
199
200
|
ordering = ['-created_at']
|
200
|
-
|
201
|
+
|
201
202
|
def __str__(self):
|
202
203
|
return f"{self.user.username} - {self.get_activity_type_display()}"
|
203
204
|
|
204
205
|
|
205
206
|
class TwilioResponse(models.Model):
|
206
207
|
"""Model for storing Twilio API responses and webhook data."""
|
207
|
-
|
208
|
+
|
208
209
|
RESPONSE_TYPES = [
|
209
210
|
('api_send', 'API Send Request'),
|
210
211
|
('api_verify', 'API Verify Request'),
|
211
212
|
('webhook_status', 'Webhook Status Update'),
|
212
213
|
('webhook_delivery', 'Webhook Delivery Report'),
|
213
214
|
]
|
214
|
-
|
215
|
+
|
215
216
|
SERVICE_TYPES = [
|
216
217
|
('whatsapp', 'WhatsApp'),
|
217
218
|
('sms', 'SMS'),
|
@@ -219,46 +220,46 @@ class TwilioResponse(models.Model):
|
|
219
220
|
('email', 'Email'),
|
220
221
|
('verify', 'Verify API'),
|
221
222
|
]
|
222
|
-
|
223
|
+
|
223
224
|
response_type = models.CharField(max_length=20, choices=RESPONSE_TYPES)
|
224
225
|
service_type = models.CharField(max_length=10, choices=SERVICE_TYPES)
|
225
|
-
|
226
|
+
|
226
227
|
# Twilio identifiers
|
227
228
|
message_sid = models.CharField(max_length=34, blank=True, help_text="Twilio Message SID")
|
228
229
|
verification_sid = models.CharField(max_length=34, blank=True, help_text="Twilio Verification SID")
|
229
|
-
|
230
|
+
|
230
231
|
# Request/Response data
|
231
232
|
request_data = models.JSONField(default=dict, help_text="Original request parameters")
|
232
233
|
response_data = models.JSONField(default=dict, help_text="Twilio API response")
|
233
|
-
|
234
|
+
|
234
235
|
# Status and error handling
|
235
236
|
status = models.CharField(max_length=20, blank=True, help_text="Message/Verification status")
|
236
237
|
error_code = models.CharField(max_length=10, blank=True, help_text="Twilio error code")
|
237
238
|
error_message = models.TextField(blank=True, help_text="Error description")
|
238
|
-
|
239
|
+
|
239
240
|
# Contact information
|
240
241
|
to_number = models.CharField(max_length=20, blank=True, help_text="Recipient phone/email")
|
241
242
|
from_number = models.CharField(max_length=20, blank=True, help_text="Sender phone/email")
|
242
|
-
|
243
|
+
|
243
244
|
# Pricing
|
244
245
|
price = models.DecimalField(max_digits=10, decimal_places=6, null=True, blank=True)
|
245
246
|
price_unit = models.CharField(max_length=3, blank=True, help_text="Currency code")
|
246
|
-
|
247
|
+
|
247
248
|
# Timestamps
|
248
249
|
created_at = models.DateTimeField(auto_now_add=True)
|
249
250
|
updated_at = models.DateTimeField(auto_now=True)
|
250
251
|
twilio_created_at = models.DateTimeField(null=True, blank=True, help_text="Timestamp from Twilio")
|
251
|
-
|
252
|
+
|
252
253
|
# Relations
|
253
254
|
otp_secret = models.ForeignKey(
|
254
|
-
'OTPSecret',
|
255
|
-
on_delete=models.SET_NULL,
|
256
|
-
null=True,
|
255
|
+
'OTPSecret',
|
256
|
+
on_delete=models.SET_NULL,
|
257
|
+
null=True,
|
257
258
|
blank=True,
|
258
259
|
related_name='twilio_responses',
|
259
260
|
help_text="Related OTP if applicable"
|
260
261
|
)
|
261
|
-
|
262
|
+
|
262
263
|
class Meta:
|
263
264
|
app_label = 'django_cfg_accounts'
|
264
265
|
verbose_name = 'Twilio Response'
|
@@ -270,15 +271,15 @@ class TwilioResponse(models.Model):
|
|
270
271
|
models.Index(fields=['status', 'created_at']),
|
271
272
|
models.Index(fields=['response_type', 'service_type']),
|
272
273
|
]
|
273
|
-
|
274
|
+
|
274
275
|
def __str__(self):
|
275
276
|
return f"{self.get_response_type_display()} - {self.get_service_type_display()}"
|
276
|
-
|
277
|
+
|
277
278
|
@property
|
278
279
|
def has_error(self):
|
279
280
|
"""Check if response has error."""
|
280
281
|
return bool(self.error_code or self.error_message)
|
281
|
-
|
282
|
+
|
282
283
|
@property
|
283
284
|
def is_successful(self):
|
284
285
|
"""Check if response is successful."""
|
@@ -5,15 +5,26 @@ Modern, clean admin interfaces with Material Icons and consistent styling.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from django.contrib import admin
|
8
|
+
from django.contrib.auth.models import Group
|
8
9
|
|
9
|
-
# Import all admin classes
|
10
|
-
from .user_admin import CustomUserAdmin
|
11
10
|
from .activity_admin import UserActivityAdmin
|
11
|
+
from .group_admin import GroupAdmin
|
12
12
|
from .otp_admin import OTPSecretAdmin
|
13
13
|
from .registration_admin import RegistrationSourceAdmin, UserRegistrationSourceAdmin
|
14
|
-
from .group_admin import GroupAdmin
|
15
14
|
from .twilio_admin import TwilioResponseAdmin, TwilioResponseInline
|
16
15
|
|
16
|
+
# Import all admin classes
|
17
|
+
from .user_admin import CustomUserAdmin
|
18
|
+
|
19
|
+
# Re-register Group with our custom admin (replaces Django's default)
|
20
|
+
# This needs to be in a ready() method or use try/except because Django's auth
|
21
|
+
# admin might register it first
|
22
|
+
try:
|
23
|
+
admin.site.unregister(Group)
|
24
|
+
except admin.sites.NotRegistered:
|
25
|
+
pass
|
26
|
+
admin.site.register(Group, GroupAdmin)
|
27
|
+
|
17
28
|
# All models are registered in their respective admin files using @admin.register
|
18
29
|
# This provides:
|
19
30
|
# - Clean separation of concerns
|
@@ -8,13 +8,13 @@ from django.contrib import admin
|
|
8
8
|
from unfold.admin import ModelAdmin
|
9
9
|
|
10
10
|
from django_cfg.modules.django_admin import (
|
11
|
-
OptimizedModelAdmin,
|
12
|
-
DisplayMixin,
|
13
|
-
UserDisplayConfig,
|
14
11
|
DateTimeDisplayConfig,
|
15
|
-
|
12
|
+
DisplayMixin,
|
16
13
|
Icons,
|
17
|
-
|
14
|
+
OptimizedModelAdmin,
|
15
|
+
StatusBadgeConfig,
|
16
|
+
UserDisplayConfig,
|
17
|
+
display,
|
18
18
|
)
|
19
19
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
20
20
|
|
@@ -25,10 +25,10 @@ from .filters import ActivityTypeFilter
|
|
25
25
|
@admin.register(UserActivity)
|
26
26
|
class UserActivityAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
27
27
|
"""Enhanced admin for UserActivity model using Django Admin Utilities."""
|
28
|
-
|
28
|
+
|
29
29
|
# Performance optimization
|
30
30
|
select_related_fields = ['user']
|
31
|
-
|
31
|
+
|
32
32
|
list_display = [
|
33
33
|
'user_display',
|
34
34
|
'activity_type_display',
|
@@ -42,7 +42,7 @@ class UserActivityAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
42
42
|
readonly_fields = ['created_at']
|
43
43
|
date_hierarchy = 'created_at'
|
44
44
|
ordering = ['-created_at']
|
45
|
-
|
45
|
+
|
46
46
|
fieldsets = (
|
47
47
|
('Activity', {
|
48
48
|
'fields': ('user', 'activity_type', 'description')
|
@@ -60,7 +60,7 @@ class UserActivityAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
60
60
|
'fields': ('created_at',)
|
61
61
|
}),
|
62
62
|
)
|
63
|
-
|
63
|
+
|
64
64
|
@display(description="User")
|
65
65
|
def user_display(self, obj):
|
66
66
|
"""Enhanced user display with avatar."""
|
@@ -70,7 +70,7 @@ class UserActivityAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
70
70
|
show_email=False
|
71
71
|
)
|
72
72
|
return self.display_user_simple(obj.user, config)
|
73
|
-
|
73
|
+
|
74
74
|
@display(description="Activity")
|
75
75
|
def activity_type_display(self, obj):
|
76
76
|
"""Activity type with appropriate icons."""
|
@@ -82,7 +82,7 @@ class UserActivityAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
82
82
|
'profile_updated': Icons.EDIT,
|
83
83
|
'registration': Icons.PERSON_ADD,
|
84
84
|
}
|
85
|
-
|
85
|
+
|
86
86
|
activity_variants = {
|
87
87
|
'login': 'success',
|
88
88
|
'logout': 'info',
|
@@ -91,22 +91,22 @@ class UserActivityAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
91
91
|
'profile_updated': 'info',
|
92
92
|
'registration': 'primary',
|
93
93
|
}
|
94
|
-
|
94
|
+
|
95
95
|
icon = activity_icons.get(obj.activity_type, Icons.DESCRIPTION)
|
96
96
|
variant = activity_variants.get(obj.activity_type, 'info')
|
97
|
-
|
97
|
+
|
98
98
|
config = StatusBadgeConfig(
|
99
99
|
show_icons=True,
|
100
100
|
icon=icon,
|
101
101
|
custom_mappings={obj.get_activity_type_display(): variant}
|
102
102
|
)
|
103
|
-
|
103
|
+
|
104
104
|
return StatusBadge.create(
|
105
105
|
text=obj.get_activity_type_display(),
|
106
106
|
variant=variant,
|
107
107
|
config=config
|
108
108
|
)
|
109
|
-
|
109
|
+
|
110
110
|
@display(description="Description")
|
111
111
|
def description_display(self, obj):
|
112
112
|
"""Truncated description with full text in tooltip."""
|
@@ -118,27 +118,27 @@ class UserActivityAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
118
118
|
variant="secondary",
|
119
119
|
config=config
|
120
120
|
)
|
121
|
-
|
121
|
+
|
122
122
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.DESCRIPTION)
|
123
123
|
return StatusBadge.create(
|
124
124
|
text=obj.description,
|
125
125
|
variant="info",
|
126
126
|
config=config
|
127
127
|
)
|
128
|
-
|
128
|
+
|
129
129
|
@display(description="IP Address")
|
130
130
|
def ip_address_display(self, obj):
|
131
131
|
"""IP address with network icon."""
|
132
132
|
if not obj.ip_address:
|
133
133
|
return "—"
|
134
|
-
|
134
|
+
|
135
135
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.PUBLIC)
|
136
136
|
return StatusBadge.create(
|
137
137
|
text=obj.ip_address,
|
138
138
|
variant="secondary",
|
139
139
|
config=config
|
140
140
|
)
|
141
|
-
|
141
|
+
|
142
142
|
@display(description="When")
|
143
143
|
def created_at_display(self, obj):
|
144
144
|
"""Created time with relative display."""
|
@@ -4,11 +4,12 @@ Custom admin filters for Accounts app.
|
|
4
4
|
Enhanced filters with better organization and performance.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.contrib import admin
|
8
|
-
from django.utils import timezone
|
9
7
|
from datetime import timedelta
|
8
|
+
|
9
|
+
from django.contrib import admin
|
10
10
|
from django.db import models
|
11
11
|
from django.db.models import Count
|
12
|
+
from django.utils import timezone
|
12
13
|
|
13
14
|
|
14
15
|
class UserStatusFilter(admin.SimpleListFilter):
|
@@ -56,7 +57,7 @@ class OTPStatusFilter(admin.SimpleListFilter):
|
|
56
57
|
def queryset(self, request, queryset):
|
57
58
|
now = timezone.now()
|
58
59
|
today_start = now.replace(hour=0, minute=0, second=0, microsecond=0)
|
59
|
-
|
60
|
+
|
60
61
|
if self.value() == "valid":
|
61
62
|
return queryset.filter(is_used=False, expires_at__gt=now)
|
62
63
|
elif self.value() == "used":
|
@@ -115,7 +116,7 @@ class ActivityTypeFilter(admin.SimpleListFilter):
|
|
115
116
|
def queryset(self, request, queryset):
|
116
117
|
now = timezone.now()
|
117
118
|
today_start = now.replace(hour=0, minute=0, second=0, microsecond=0)
|
118
|
-
|
119
|
+
|
119
120
|
if self.value() == "recent":
|
120
121
|
return queryset.filter(created_at__gte=now - timedelta(hours=24))
|
121
122
|
elif self.value() == "today":
|
@@ -140,12 +141,12 @@ class TwilioResponseStatusFilter(admin.SimpleListFilter):
|
|
140
141
|
|
141
142
|
def queryset(self, request, queryset):
|
142
143
|
now = timezone.now()
|
143
|
-
|
144
|
+
|
144
145
|
if self.value() == "success":
|
145
146
|
return queryset.filter(error_code__isnull=True, error_message__isnull=True)
|
146
147
|
elif self.value() == "error":
|
147
148
|
return queryset.filter(
|
148
|
-
models.Q(error_code__isnull=False) |
|
149
|
+
models.Q(error_code__isnull=False) |
|
149
150
|
models.Q(error_message__isnull=False)
|
150
151
|
)
|
151
152
|
elif self.value() == "pending":
|
@@ -9,23 +9,17 @@ from django.contrib.auth.models import Group
|
|
9
9
|
from unfold.admin import ModelAdmin
|
10
10
|
|
11
11
|
from django_cfg.modules.django_admin import (
|
12
|
-
OptimizedModelAdmin,
|
13
12
|
DisplayMixin,
|
14
|
-
StatusBadgeConfig,
|
15
13
|
Icons,
|
16
|
-
|
14
|
+
OptimizedModelAdmin,
|
15
|
+
StatusBadgeConfig,
|
16
|
+
display,
|
17
17
|
)
|
18
18
|
from django_cfg.modules.django_admin.utils.badges import StatusBadge
|
19
19
|
|
20
|
-
|
21
|
-
# Unregister the default Group admin
|
22
|
-
admin.site.unregister(Group)
|
23
|
-
|
24
|
-
|
25
|
-
@admin.register(Group)
|
26
20
|
class GroupAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
27
21
|
"""Enhanced admin for Group model using Django Admin Utilities."""
|
28
|
-
|
22
|
+
|
29
23
|
list_display = [
|
30
24
|
'name_display',
|
31
25
|
'users_count_display',
|
@@ -35,7 +29,7 @@ class GroupAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
35
29
|
search_fields = ['name']
|
36
30
|
filter_horizontal = ['permissions']
|
37
31
|
ordering = ['name']
|
38
|
-
|
32
|
+
|
39
33
|
fieldsets = (
|
40
34
|
('Group Details', {
|
41
35
|
'fields': ('name',)
|
@@ -45,7 +39,7 @@ class GroupAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
45
39
|
'classes': ('collapse',)
|
46
40
|
}),
|
47
41
|
)
|
48
|
-
|
42
|
+
|
49
43
|
@display(description="Group Name")
|
50
44
|
def name_display(self, obj):
|
51
45
|
"""Group name display with group icon."""
|
@@ -55,21 +49,21 @@ class GroupAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
55
49
|
variant="primary",
|
56
50
|
config=config
|
57
51
|
)
|
58
|
-
|
52
|
+
|
59
53
|
@display(description="Users")
|
60
54
|
def users_count_display(self, obj):
|
61
55
|
"""Count of users in this group."""
|
62
56
|
count = obj.user_set.count()
|
63
57
|
if count == 0:
|
64
58
|
return "—"
|
65
|
-
|
59
|
+
|
66
60
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.PEOPLE)
|
67
61
|
return StatusBadge.create(
|
68
62
|
text=f"{count} user{'s' if count != 1 else ''}",
|
69
63
|
variant="info",
|
70
64
|
config=config
|
71
65
|
)
|
72
|
-
|
66
|
+
|
73
67
|
@display(description="Permissions")
|
74
68
|
def permissions_count_display(self, obj):
|
75
69
|
"""Count of permissions in this group."""
|
@@ -77,7 +71,7 @@ class GroupAdmin(OptimizedModelAdmin, DisplayMixin, ModelAdmin):
|
|
77
71
|
if count == 0:
|
78
72
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.SECURITY)
|
79
73
|
return StatusBadge.create(text="No permissions", variant="secondary", config=config)
|
80
|
-
|
74
|
+
|
81
75
|
config = StatusBadgeConfig(show_icons=True, icon=Icons.SECURITY)
|
82
76
|
return StatusBadge.create(
|
83
77
|
text=f"{count} permission{'s' if count != 1 else ''}",
|
@@ -6,9 +6,11 @@ Enhanced inline classes with better organization and conditional loading.
|
|
6
6
|
|
7
7
|
from unfold.admin import TabularInline
|
8
8
|
|
9
|
-
from django_cfg.modules.base import BaseCfgModule
|
10
9
|
from django_cfg.apps.support.models import Ticket
|
11
|
-
from
|
10
|
+
from django_cfg.modules.base import BaseCfgModule
|
11
|
+
|
12
|
+
from ..models import UserActivity, UserRegistrationSource
|
13
|
+
|
12
14
|
|
13
15
|
class UserRegistrationSourceInline(TabularInline):
|
14
16
|
"""Enhanced inline for user registration sources."""
|
@@ -54,7 +56,7 @@ class UserActivityInline(TabularInline):
|
|
54
56
|
ordering = ["-created_at"]
|
55
57
|
verbose_name = "Activity"
|
56
58
|
verbose_name_plural = "Recent Activities"
|
57
|
-
|
59
|
+
|
58
60
|
# Show only recent activities to avoid performance issues
|
59
61
|
def get_queryset(self, request):
|
60
62
|
qs = super().get_queryset(request)
|
@@ -70,13 +72,13 @@ class UserActivityInline(TabularInline):
|
|
70
72
|
|
71
73
|
class UserEmailLogInline(TabularInline):
|
72
74
|
"""Enhanced inline for viewing user's email logs."""
|
73
|
-
|
75
|
+
|
74
76
|
def __init__(self, *args, **kwargs):
|
75
77
|
# Check if newsletter app is available and enabled
|
76
78
|
self.model = None
|
77
79
|
try:
|
78
80
|
base_module = BaseCfgModule()
|
79
|
-
|
81
|
+
|
80
82
|
# Only import if newsletter is enabled
|
81
83
|
if base_module.is_newsletter_enabled():
|
82
84
|
from django_cfg.apps.newsletter.models import EmailLog
|
@@ -84,11 +86,11 @@ class UserEmailLogInline(TabularInline):
|
|
84
86
|
except (ImportError, Exception):
|
85
87
|
# Newsletter app not available or not enabled
|
86
88
|
pass
|
87
|
-
|
89
|
+
|
88
90
|
# Only call super if we have a valid model
|
89
91
|
if self.model:
|
90
92
|
super().__init__(*args, **kwargs)
|
91
|
-
|
93
|
+
|
92
94
|
extra = 0
|
93
95
|
max_num = 15 # Limit to 15 most recent emails
|
94
96
|
readonly_fields = ["newsletter", "campaign", "recipient", "subject", "status", "created_at", "sent_at"]
|
@@ -96,7 +98,7 @@ class UserEmailLogInline(TabularInline):
|
|
96
98
|
ordering = ["-created_at"]
|
97
99
|
verbose_name = "Email Log"
|
98
100
|
verbose_name_plural = "Email History"
|
99
|
-
|
101
|
+
|
100
102
|
# Show only recent emails to avoid performance issues
|
101
103
|
def get_queryset(self, request):
|
102
104
|
if not self.model:
|
@@ -104,13 +106,13 @@ class UserEmailLogInline(TabularInline):
|
|
104
106
|
qs = super().get_queryset(request)
|
105
107
|
# Don't slice here - let Django handle formset filtering first
|
106
108
|
return qs.order_by('-created_at')
|
107
|
-
|
109
|
+
|
108
110
|
def has_add_permission(self, request, obj=None):
|
109
111
|
return False
|
110
|
-
|
112
|
+
|
111
113
|
def has_delete_permission(self, request, obj=None):
|
112
114
|
return False
|
113
|
-
|
115
|
+
|
114
116
|
def has_view_permission(self, request, obj=None):
|
115
117
|
# Only show if newsletter app is enabled and model exists
|
116
118
|
if not self.model:
|
@@ -124,24 +126,24 @@ class UserEmailLogInline(TabularInline):
|
|
124
126
|
|
125
127
|
class UserSupportTicketsInline(TabularInline):
|
126
128
|
"""Enhanced inline for viewing user's support tickets."""
|
127
|
-
|
129
|
+
|
128
130
|
def __init__(self, *args, **kwargs):
|
129
131
|
# Check if support app is available and enabled
|
130
132
|
self.model = None
|
131
133
|
try:
|
132
134
|
base_module = BaseCfgModule()
|
133
|
-
|
135
|
+
|
134
136
|
# Only import if support is enabled
|
135
137
|
if base_module.is_support_enabled():
|
136
138
|
self.model = Ticket
|
137
139
|
except (ImportError, Exception):
|
138
140
|
# Support app not available or not enabled
|
139
141
|
pass
|
140
|
-
|
142
|
+
|
141
143
|
# Only call super if we have a valid model
|
142
144
|
if self.model:
|
143
145
|
super().__init__(*args, **kwargs)
|
144
|
-
|
146
|
+
|
145
147
|
extra = 0
|
146
148
|
max_num = 10 # Limit to 10 most recent tickets
|
147
149
|
readonly_fields = ["uuid", "subject", "status", "created_at"]
|
@@ -149,7 +151,7 @@ class UserSupportTicketsInline(TabularInline):
|
|
149
151
|
ordering = ["-created_at"]
|
150
152
|
verbose_name = "Support Ticket"
|
151
153
|
verbose_name_plural = "Support Tickets"
|
152
|
-
|
154
|
+
|
153
155
|
# Show only recent tickets to avoid performance issues
|
154
156
|
def get_queryset(self, request):
|
155
157
|
if not self.model:
|
@@ -157,13 +159,13 @@ class UserSupportTicketsInline(TabularInline):
|
|
157
159
|
qs = super().get_queryset(request)
|
158
160
|
# Don't slice here - let Django handle formset filtering first
|
159
161
|
return qs.order_by('-created_at')
|
160
|
-
|
162
|
+
|
161
163
|
def has_add_permission(self, request, obj=None):
|
162
164
|
return False
|
163
|
-
|
165
|
+
|
164
166
|
def has_delete_permission(self, request, obj=None):
|
165
167
|
return False
|
166
|
-
|
168
|
+
|
167
169
|
def has_view_permission(self, request, obj=None):
|
168
170
|
# Only show if support app is enabled and model exists
|
169
171
|
if not self.model:
|