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
@@ -4,56 +4,56 @@ CloudflareSite custom manager.
|
|
4
4
|
Simplified manager with useful query methods for sites.
|
5
5
|
"""
|
6
6
|
|
7
|
+
from datetime import timedelta
|
8
|
+
|
7
9
|
from django.db import models
|
8
10
|
from django.utils import timezone
|
9
|
-
from typing import List
|
10
|
-
from datetime import timedelta
|
11
11
|
|
12
12
|
|
13
13
|
class CloudflareSiteQuerySet(models.QuerySet):
|
14
14
|
"""Custom queryset for CloudflareSite with useful filters."""
|
15
|
-
|
15
|
+
|
16
16
|
def active(self):
|
17
17
|
"""Get active sites."""
|
18
18
|
return self.filter(is_active=True)
|
19
|
-
|
19
|
+
|
20
20
|
def inactive(self):
|
21
21
|
"""Get inactive sites."""
|
22
22
|
return self.filter(is_active=False)
|
23
|
-
|
23
|
+
|
24
24
|
def in_maintenance(self):
|
25
25
|
"""Get sites currently in maintenance mode."""
|
26
26
|
return self.filter(maintenance_active=True)
|
27
|
-
|
27
|
+
|
28
28
|
def not_in_maintenance(self):
|
29
29
|
"""Get sites not in maintenance mode."""
|
30
30
|
return self.filter(maintenance_active=False)
|
31
|
-
|
31
|
+
|
32
32
|
def by_domain(self, domain: str):
|
33
33
|
"""Filter by domain (exact or contains)."""
|
34
34
|
if '.' in domain:
|
35
35
|
return self.filter(domain__iexact=domain)
|
36
36
|
else:
|
37
37
|
return self.filter(domain__icontains=domain)
|
38
|
-
|
38
|
+
|
39
39
|
def by_name(self, name: str):
|
40
40
|
"""Filter by site name."""
|
41
41
|
return self.filter(name__icontains=name)
|
42
|
-
|
42
|
+
|
43
43
|
def recent(self, days: int = 7):
|
44
44
|
"""Get recently created sites."""
|
45
45
|
cutoff = timezone.now() - timedelta(days=days)
|
46
46
|
return self.filter(created_at__gte=cutoff)
|
47
|
-
|
47
|
+
|
48
48
|
def recently_maintained(self, days: int = 7):
|
49
49
|
"""Get sites that had maintenance recently."""
|
50
50
|
cutoff = timezone.now() - timedelta(days=days)
|
51
51
|
return self.filter(last_maintenance_at__gte=cutoff)
|
52
|
-
|
52
|
+
|
53
53
|
def with_logs(self):
|
54
54
|
"""Include related logs in query."""
|
55
55
|
return self.prefetch_related('logs')
|
56
|
-
|
56
|
+
|
57
57
|
def with_recent_logs(self, limit: int = 5):
|
58
58
|
"""Include recent logs in query."""
|
59
59
|
from django.db.models import Prefetch
|
@@ -64,7 +64,7 @@ class CloudflareSiteQuerySet(models.QuerySet):
|
|
64
64
|
to_attr='recent_logs'
|
65
65
|
)
|
66
66
|
)
|
67
|
-
|
67
|
+
|
68
68
|
def search(self, query: str):
|
69
69
|
"""Search sites by name or domain."""
|
70
70
|
return self.filter(
|
@@ -75,49 +75,49 @@ class CloudflareSiteQuerySet(models.QuerySet):
|
|
75
75
|
|
76
76
|
class CloudflareSiteManager(models.Manager):
|
77
77
|
"""Custom manager for CloudflareSite."""
|
78
|
-
|
78
|
+
|
79
79
|
def get_queryset(self):
|
80
80
|
"""Return custom queryset."""
|
81
81
|
return CloudflareSiteQuerySet(self.model, using=self._db)
|
82
|
-
|
82
|
+
|
83
83
|
def active(self):
|
84
84
|
"""Get active sites."""
|
85
85
|
return self.get_queryset().active()
|
86
|
-
|
86
|
+
|
87
87
|
def inactive(self):
|
88
88
|
"""Get inactive sites."""
|
89
89
|
return self.get_queryset().inactive()
|
90
|
-
|
90
|
+
|
91
91
|
def in_maintenance(self):
|
92
92
|
"""Get sites in maintenance mode."""
|
93
93
|
return self.get_queryset().in_maintenance()
|
94
|
-
|
94
|
+
|
95
95
|
def not_in_maintenance(self):
|
96
96
|
"""Get sites not in maintenance mode."""
|
97
97
|
return self.get_queryset().not_in_maintenance()
|
98
|
-
|
98
|
+
|
99
99
|
def by_domain(self, domain: str):
|
100
100
|
"""Find site by domain."""
|
101
101
|
return self.get_queryset().by_domain(domain)
|
102
|
-
|
102
|
+
|
103
103
|
def search(self, query: str):
|
104
104
|
"""Search sites."""
|
105
105
|
return self.get_queryset().search(query)
|
106
|
-
|
106
|
+
|
107
107
|
def recent(self, days: int = 7):
|
108
108
|
"""Get recent sites."""
|
109
109
|
return self.get_queryset().recent(days)
|
110
|
-
|
110
|
+
|
111
111
|
def recently_maintained(self, days: int = 7):
|
112
112
|
"""Get recently maintained sites."""
|
113
113
|
return self.get_queryset().recently_maintained(days)
|
114
|
-
|
114
|
+
|
115
115
|
def get_stats(self):
|
116
116
|
"""Get site statistics."""
|
117
117
|
total = self.count()
|
118
118
|
active = self.active().count()
|
119
119
|
in_maintenance = self.in_maintenance().count()
|
120
|
-
|
120
|
+
|
121
121
|
return {
|
122
122
|
'total': total,
|
123
123
|
'active': active,
|
@@ -125,28 +125,29 @@ class CloudflareSiteManager(models.Manager):
|
|
125
125
|
'in_maintenance': in_maintenance,
|
126
126
|
'normal': active - in_maintenance,
|
127
127
|
}
|
128
|
-
|
128
|
+
|
129
129
|
def bulk_sync_all(self):
|
130
130
|
"""Bulk sync all sites with Cloudflare."""
|
131
|
-
from ..services import SiteSyncService
|
132
|
-
from ..models import CloudflareApiKey
|
133
131
|
import logging
|
134
|
-
|
132
|
+
|
133
|
+
from ..models import CloudflareApiKey
|
134
|
+
from ..services import SiteSyncService
|
135
|
+
|
135
136
|
logger = logging.getLogger(__name__)
|
136
137
|
synced = 0
|
137
138
|
errors = 0
|
138
139
|
error_details = []
|
139
|
-
|
140
|
+
|
140
141
|
# Get all active API keys
|
141
142
|
api_keys = CloudflareApiKey.objects.filter(is_active=True)
|
142
|
-
|
143
|
+
|
143
144
|
if not api_keys.exists():
|
144
145
|
return {
|
145
146
|
'synced': 0,
|
146
147
|
'errors': 1,
|
147
148
|
'error_details': ['No active API keys found']
|
148
149
|
}
|
149
|
-
|
150
|
+
|
150
151
|
for api_key in api_keys:
|
151
152
|
try:
|
152
153
|
sync_service = SiteSyncService(api_key)
|
@@ -160,24 +161,24 @@ class CloudflareSiteManager(models.Manager):
|
|
160
161
|
error_msg = f"API key '{api_key.name}': {str(e)}"
|
161
162
|
error_details.append(error_msg)
|
162
163
|
logger.error(f"Sync failed for API key {api_key.name}: {e}")
|
163
|
-
|
164
|
+
|
164
165
|
return {
|
165
166
|
'synced': synced,
|
166
167
|
'errors': errors,
|
167
168
|
'error_details': error_details
|
168
169
|
}
|
169
|
-
|
170
|
+
|
170
171
|
def discover_all_sites(self):
|
171
172
|
"""Discover new sites from all API keys."""
|
172
|
-
from ..services import SiteSyncService
|
173
173
|
from ..models import CloudflareApiKey
|
174
|
-
|
174
|
+
from ..services import SiteSyncService
|
175
|
+
|
175
176
|
discovered = 0
|
176
177
|
errors = 0
|
177
|
-
|
178
|
+
|
178
179
|
# Get all active API keys
|
179
180
|
api_keys = CloudflareApiKey.objects.filter(is_active=True)
|
180
|
-
|
181
|
+
|
181
182
|
for api_key in api_keys:
|
182
183
|
try:
|
183
184
|
sync_service = SiteSyncService(api_key)
|
@@ -185,7 +186,7 @@ class CloudflareSiteManager(models.Manager):
|
|
185
186
|
discovered += result.get('created', 0) # Count only newly created sites
|
186
187
|
except Exception:
|
187
188
|
errors += 1
|
188
|
-
|
189
|
+
|
189
190
|
return {
|
190
191
|
'discovered': discovered,
|
191
192
|
'errors': errors
|
@@ -4,80 +4,81 @@ MaintenanceLog custom manager.
|
|
4
4
|
Simplified manager with useful query methods for logs.
|
5
5
|
"""
|
6
6
|
|
7
|
+
from datetime import timedelta
|
8
|
+
|
7
9
|
from django.db import models
|
8
10
|
from django.utils import timezone
|
9
|
-
from datetime import timedelta
|
10
11
|
|
11
12
|
|
12
13
|
class MaintenanceLogQuerySet(models.QuerySet):
|
13
14
|
"""Custom queryset for MaintenanceLog with useful filters."""
|
14
|
-
|
15
|
+
|
15
16
|
def successful(self):
|
16
17
|
"""Get successful operations."""
|
17
18
|
return self.filter(status='success')
|
18
|
-
|
19
|
+
|
19
20
|
def failed(self):
|
20
21
|
"""Get failed operations."""
|
21
22
|
return self.filter(status='failed')
|
22
|
-
|
23
|
+
|
23
24
|
def pending(self):
|
24
25
|
"""Get pending operations."""
|
25
26
|
return self.filter(status='pending')
|
26
|
-
|
27
|
+
|
27
28
|
def by_action(self, action: str):
|
28
29
|
"""Filter by action type."""
|
29
30
|
return self.filter(action=action)
|
30
|
-
|
31
|
+
|
31
32
|
def enable_actions(self):
|
32
33
|
"""Get enable maintenance actions."""
|
33
34
|
return self.filter(action='enable')
|
34
|
-
|
35
|
+
|
35
36
|
def disable_actions(self):
|
36
37
|
"""Get disable maintenance actions."""
|
37
38
|
return self.filter(action='disable')
|
38
|
-
|
39
|
+
|
39
40
|
def sync_actions(self):
|
40
41
|
"""Get sync actions."""
|
41
42
|
return self.filter(action='sync')
|
42
|
-
|
43
|
+
|
43
44
|
def error_actions(self):
|
44
45
|
"""Get error actions."""
|
45
46
|
return self.filter(action='error')
|
46
|
-
|
47
|
+
|
47
48
|
def for_site(self, site):
|
48
49
|
"""Get logs for specific site."""
|
49
50
|
return self.filter(site=site)
|
50
|
-
|
51
|
+
|
51
52
|
def for_domain(self, domain: str):
|
52
53
|
"""Get logs for specific domain."""
|
53
54
|
return self.filter(site__domain=domain)
|
54
|
-
|
55
|
+
|
55
56
|
def recent(self, days: int = 7):
|
56
57
|
"""Get recent logs."""
|
57
58
|
cutoff = timezone.now() - timedelta(days=days)
|
58
59
|
return self.filter(created_at__gte=cutoff)
|
59
|
-
|
60
|
+
|
60
61
|
def today(self):
|
61
62
|
"""Get today's logs."""
|
62
63
|
today = timezone.now().date()
|
63
64
|
return self.filter(created_at__date=today)
|
64
|
-
|
65
|
+
|
65
66
|
def with_errors(self):
|
66
67
|
"""Get logs that have error messages."""
|
67
68
|
return self.filter(error_message__isnull=False).exclude(error_message='')
|
68
|
-
|
69
|
+
|
69
70
|
def with_cloudflare_response(self):
|
70
71
|
"""Get logs that have Cloudflare response data."""
|
71
72
|
return self.filter(cloudflare_response__isnull=False)
|
72
|
-
|
73
|
+
|
73
74
|
def fast_operations(self, max_seconds: int = 5):
|
74
75
|
"""Get operations that completed quickly."""
|
75
76
|
return self.filter(duration_seconds__lte=max_seconds)
|
76
|
-
|
77
|
+
|
77
78
|
def slow_operations(self, min_seconds: int = 30):
|
78
79
|
"""Get operations that took a long time."""
|
79
80
|
return self.filter(duration_seconds__gte=min_seconds)
|
80
|
-
|
81
|
+
|
81
82
|
def search(self, query: str):
|
82
83
|
"""Search logs by reason or error message."""
|
83
84
|
return self.filter(
|
@@ -90,54 +91,54 @@ class MaintenanceLogQuerySet(models.QuerySet):
|
|
90
91
|
|
91
92
|
class MaintenanceLogManager(models.Manager):
|
92
93
|
"""Custom manager for MaintenanceLog."""
|
93
|
-
|
94
|
+
|
94
95
|
def get_queryset(self):
|
95
96
|
"""Return custom queryset."""
|
96
97
|
return MaintenanceLogQuerySet(self.model, using=self._db)
|
97
|
-
|
98
|
+
|
98
99
|
def successful(self):
|
99
100
|
"""Get successful operations."""
|
100
101
|
return self.get_queryset().successful()
|
101
|
-
|
102
|
+
|
102
103
|
def failed(self):
|
103
104
|
"""Get failed operations."""
|
104
105
|
return self.get_queryset().failed()
|
105
|
-
|
106
|
+
|
106
107
|
def pending(self):
|
107
108
|
"""Get pending operations."""
|
108
109
|
return self.get_queryset().pending()
|
109
|
-
|
110
|
+
|
110
111
|
def recent(self, days: int = 7):
|
111
112
|
"""Get recent logs."""
|
112
113
|
return self.get_queryset().recent(days)
|
113
|
-
|
114
|
+
|
114
115
|
def today(self):
|
115
116
|
"""Get today's logs."""
|
116
117
|
return self.get_queryset().today()
|
117
|
-
|
118
|
+
|
118
119
|
def for_site(self, site):
|
119
120
|
"""Get logs for site."""
|
120
121
|
return self.get_queryset().for_site(site)
|
121
|
-
|
122
|
+
|
122
123
|
def for_domain(self, domain: str):
|
123
124
|
"""Get logs for domain."""
|
124
125
|
return self.get_queryset().for_domain(domain)
|
125
|
-
|
126
|
+
|
126
127
|
def with_errors(self):
|
127
128
|
"""Get logs with errors."""
|
128
129
|
return self.get_queryset().with_errors()
|
129
|
-
|
130
|
+
|
130
131
|
def search(self, query: str):
|
131
132
|
"""Search logs."""
|
132
133
|
return self.get_queryset().search(query)
|
133
|
-
|
134
|
+
|
134
135
|
def get_stats(self):
|
135
136
|
"""Get log statistics."""
|
136
137
|
total = self.count()
|
137
138
|
successful = self.successful().count()
|
138
139
|
failed = self.failed().count()
|
139
140
|
pending = self.pending().count()
|
140
|
-
|
141
|
+
|
141
142
|
return {
|
142
143
|
'total': total,
|
143
144
|
'successful': successful,
|
@@ -145,7 +146,7 @@ class MaintenanceLogManager(models.Manager):
|
|
145
146
|
'pending': pending,
|
146
147
|
'success_rate': (successful / total * 100) if total > 0 else 0,
|
147
148
|
}
|
148
|
-
|
149
|
+
|
149
150
|
def get_recent_activity(self, days: int = 7, limit: int = 10):
|
150
151
|
"""Get recent activity summary."""
|
151
152
|
return self.recent(days).order_by('-created_at')[:limit]
|
@@ -18,11 +18,11 @@ def __getattr__(name: str):
|
|
18
18
|
"""Lazy import mechanism to avoid Django initialization issues."""
|
19
19
|
if name in _LAZY_IMPORTS:
|
20
20
|
module_path, attr_name = _LAZY_IMPORTS[name]
|
21
|
-
|
21
|
+
|
22
22
|
import importlib
|
23
23
|
module = importlib.import_module(module_path)
|
24
24
|
return getattr(module, attr_name)
|
25
|
-
|
25
|
+
|
26
26
|
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
|
27
27
|
|
28
28
|
|
@@ -4,8 +4,8 @@ CloudflareApiKey model.
|
|
4
4
|
Store Cloudflare API keys for different accounts/domains.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from django.db import models
|
8
7
|
from django.core.exceptions import ValidationError
|
8
|
+
from django.db import models
|
9
9
|
|
10
10
|
|
11
11
|
class CloudflareApiKey(models.Model):
|
@@ -14,7 +14,7 @@ class CloudflareApiKey(models.Model):
|
|
14
14
|
|
15
15
|
Allows managing multiple Cloudflare accounts with different API tokens.
|
16
16
|
"""
|
17
|
-
|
17
|
+
|
18
18
|
# Basic info
|
19
19
|
name = models.CharField(
|
20
20
|
max_length=100,
|
@@ -24,7 +24,7 @@ class CloudflareApiKey(models.Model):
|
|
24
24
|
blank=True,
|
25
25
|
help_text="Optional description of what this key is used for"
|
26
26
|
)
|
27
|
-
|
27
|
+
|
28
28
|
# Cloudflare credentials
|
29
29
|
api_token = models.CharField(
|
30
30
|
max_length=255,
|
@@ -35,7 +35,7 @@ class CloudflareApiKey(models.Model):
|
|
35
35
|
blank=True,
|
36
36
|
help_text="Cloudflare Account ID (auto-discovered if empty)"
|
37
37
|
)
|
38
|
-
|
38
|
+
|
39
39
|
# Settings
|
40
40
|
is_active = models.BooleanField(
|
41
41
|
default=True,
|
@@ -45,7 +45,7 @@ class CloudflareApiKey(models.Model):
|
|
45
45
|
default=False,
|
46
46
|
help_text="Whether this is the default API key to use"
|
47
47
|
)
|
48
|
-
|
48
|
+
|
49
49
|
# Timestamps
|
50
50
|
created_at = models.DateTimeField(auto_now_add=True)
|
51
51
|
updated_at = models.DateTimeField(auto_now=True)
|
@@ -54,7 +54,7 @@ class CloudflareApiKey(models.Model):
|
|
54
54
|
blank=True,
|
55
55
|
help_text="When this API key was last used"
|
56
56
|
)
|
57
|
-
|
57
|
+
|
58
58
|
class Meta:
|
59
59
|
ordering = ['-is_default', 'name']
|
60
60
|
verbose_name = "Cloudflare API Key"
|
@@ -63,32 +63,32 @@ class CloudflareApiKey(models.Model):
|
|
63
63
|
models.Index(fields=['is_active']),
|
64
64
|
models.Index(fields=['is_default']),
|
65
65
|
]
|
66
|
-
|
66
|
+
|
67
67
|
def __str__(self) -> str:
|
68
68
|
status = "🔑" if self.is_active else "🔒"
|
69
69
|
default = " (Default)" if self.is_default else ""
|
70
70
|
return f"{status} {self.name}{default}"
|
71
|
-
|
71
|
+
|
72
72
|
def clean(self) -> None:
|
73
73
|
"""Validate model data."""
|
74
74
|
super().clean()
|
75
|
-
|
75
|
+
|
76
76
|
# Validate API token format (basic check)
|
77
77
|
if not self.api_token.strip():
|
78
78
|
raise ValidationError({'api_token': 'API token cannot be empty'})
|
79
|
-
|
79
|
+
|
80
80
|
# Validate account_id format if provided
|
81
81
|
if self.account_id and len(self.account_id) != 32:
|
82
82
|
raise ValidationError({'account_id': 'Account ID must be 32 characters'})
|
83
|
-
|
83
|
+
|
84
84
|
def save(self, *args, **kwargs):
|
85
85
|
"""Override save to ensure only one default key."""
|
86
86
|
if self.is_default:
|
87
87
|
# Set all other keys to non-default
|
88
88
|
self.__class__.objects.filter(is_default=True).exclude(pk=self.pk).update(is_default=False)
|
89
|
-
|
89
|
+
|
90
90
|
super().save(*args, **kwargs)
|
91
|
-
|
91
|
+
|
92
92
|
@classmethod
|
93
93
|
def get_default(cls):
|
94
94
|
"""Get the default API key."""
|
@@ -96,12 +96,12 @@ class CloudflareApiKey(models.Model):
|
|
96
96
|
return cls.objects.filter(is_active=True, is_default=True).first()
|
97
97
|
except cls.DoesNotExist:
|
98
98
|
return None
|
99
|
-
|
99
|
+
|
100
100
|
@classmethod
|
101
101
|
def get_active_keys(cls):
|
102
102
|
"""Get all active API keys."""
|
103
103
|
return cls.objects.filter(is_active=True)
|
104
|
-
|
104
|
+
|
105
105
|
def mark_used(self):
|
106
106
|
"""Mark this key as recently used."""
|
107
107
|
from django.utils import timezone
|
@@ -4,20 +4,22 @@ CloudflareSite model.
|
|
4
4
|
Simplified model for storing Cloudflare sites for synchronization and maintenance.
|
5
5
|
"""
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
import re
|
8
|
+
|
9
9
|
from django.core.exceptions import ValidationError
|
10
|
+
from django.db import models
|
10
11
|
from django.utils import timezone
|
11
|
-
|
12
|
+
|
12
13
|
from django_cfg.config import get_maintenance_url
|
13
14
|
|
15
|
+
|
14
16
|
class CloudflareSite(models.Model):
|
15
17
|
"""
|
16
18
|
Store Cloudflare sites for synchronization and maintenance.
|
17
19
|
|
18
20
|
Simplified from 30+ fields to just 11 essential fields.
|
19
21
|
"""
|
20
|
-
|
22
|
+
|
21
23
|
# Basic info
|
22
24
|
name = models.CharField(
|
23
25
|
max_length=100,
|
@@ -28,7 +30,7 @@ class CloudflareSite(models.Model):
|
|
28
30
|
unique=True,
|
29
31
|
help_text="Domain name (e.g., vamcar.com)"
|
30
32
|
)
|
31
|
-
|
33
|
+
|
32
34
|
# Subdomains configuration
|
33
35
|
include_subdomains = models.BooleanField(
|
34
36
|
default=True,
|
@@ -38,7 +40,7 @@ class CloudflareSite(models.Model):
|
|
38
40
|
blank=True,
|
39
41
|
help_text="Comma-separated list of specific subdomains to include (e.g., api,www,app)"
|
40
42
|
)
|
41
|
-
|
43
|
+
|
42
44
|
# Cloudflare IDs (auto-discovered during sync)
|
43
45
|
zone_id = models.CharField(
|
44
46
|
max_length=32,
|
@@ -54,7 +56,7 @@ class CloudflareSite(models.Model):
|
|
54
56
|
on_delete=models.PROTECT,
|
55
57
|
help_text="API key to use for this site"
|
56
58
|
)
|
57
|
-
|
59
|
+
|
58
60
|
# Simple status
|
59
61
|
maintenance_active = models.BooleanField(
|
60
62
|
default=False,
|
@@ -69,7 +71,7 @@ class CloudflareSite(models.Model):
|
|
69
71
|
default=True,
|
70
72
|
help_text="Whether this site is active in our system"
|
71
73
|
)
|
72
|
-
|
74
|
+
|
73
75
|
# Timestamps
|
74
76
|
created_at = models.DateTimeField(auto_now_add=True)
|
75
77
|
updated_at = models.DateTimeField(auto_now=True)
|
@@ -78,11 +80,11 @@ class CloudflareSite(models.Model):
|
|
78
80
|
blank=True,
|
79
81
|
help_text="When maintenance was last activated"
|
80
82
|
)
|
81
|
-
|
83
|
+
|
82
84
|
# Custom manager
|
83
85
|
from ..managers.cloudflare_site_manager import CloudflareSiteManager
|
84
86
|
objects = CloudflareSiteManager()
|
85
|
-
|
87
|
+
|
86
88
|
class Meta:
|
87
89
|
ordering = ['name']
|
88
90
|
verbose_name = "Cloudflare Site"
|
@@ -92,22 +94,22 @@ class CloudflareSite(models.Model):
|
|
92
94
|
models.Index(fields=['maintenance_active']),
|
93
95
|
models.Index(fields=['is_active']),
|
94
96
|
]
|
95
|
-
|
97
|
+
|
96
98
|
def __str__(self) -> str:
|
97
99
|
status_emoji = "🔧" if self.maintenance_active else "🟢"
|
98
100
|
return f"{status_emoji} {self.name} ({self.domain})"
|
99
|
-
|
101
|
+
|
100
102
|
def enable_maintenance(self) -> None:
|
101
103
|
"""Enable maintenance mode for this site."""
|
102
104
|
self.maintenance_active = True
|
103
105
|
self.last_maintenance_at = timezone.now()
|
104
106
|
self.save(update_fields=['maintenance_active', 'last_maintenance_at', 'updated_at'])
|
105
|
-
|
107
|
+
|
106
108
|
def disable_maintenance(self) -> None:
|
107
109
|
"""Disable maintenance mode for this site."""
|
108
110
|
self.maintenance_active = False
|
109
111
|
self.save(update_fields=['maintenance_active', 'updated_at'])
|
110
|
-
|
112
|
+
|
111
113
|
def get_maintenance_url(self) -> str:
|
112
114
|
"""Get the maintenance URL for this site."""
|
113
115
|
if self.maintenance_url:
|
@@ -115,11 +117,11 @@ class CloudflareSite(models.Model):
|
|
115
117
|
else:
|
116
118
|
# Default maintenance page with site parameter
|
117
119
|
return get_maintenance_url(self.domain)
|
118
|
-
|
120
|
+
|
119
121
|
def get_domain_patterns(self) -> list[str]:
|
120
122
|
"""Get list of domain patterns for Page Rules based on subdomain configuration."""
|
121
123
|
patterns = []
|
122
|
-
|
124
|
+
|
123
125
|
if self.include_subdomains:
|
124
126
|
# Include all subdomains with wildcard
|
125
127
|
patterns.append(f"*{self.domain}/*")
|
@@ -128,15 +130,15 @@ class CloudflareSite(models.Model):
|
|
128
130
|
else:
|
129
131
|
# Only root domain
|
130
132
|
patterns.append(f"{self.domain}/*")
|
131
|
-
|
133
|
+
|
132
134
|
# Add specific subdomains if specified
|
133
135
|
if self.subdomain_list.strip():
|
134
136
|
subdomains = [sub.strip() for sub in self.subdomain_list.split(',') if sub.strip()]
|
135
137
|
for subdomain in subdomains:
|
136
138
|
patterns.append(f"{subdomain}.{self.domain}/*")
|
137
|
-
|
139
|
+
|
138
140
|
return patterns
|
139
|
-
|
141
|
+
|
140
142
|
def get_subdomain_display(self) -> str:
|
141
143
|
"""Get human-readable subdomain configuration."""
|
142
144
|
if self.include_subdomains:
|
@@ -146,11 +148,11 @@ class CloudflareSite(models.Model):
|
|
146
148
|
return f"Specific: {', '.join(subdomains)}.{self.domain}"
|
147
149
|
else:
|
148
150
|
return f"Root domain only ({self.domain})"
|
149
|
-
|
151
|
+
|
150
152
|
def clean(self) -> None:
|
151
153
|
"""Validate model data."""
|
152
154
|
super().clean()
|
153
|
-
|
155
|
+
|
154
156
|
# Validate domain format
|
155
157
|
domain_pattern = re.compile(
|
156
158
|
r'^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?'
|
@@ -158,7 +160,7 @@ class CloudflareSite(models.Model):
|
|
158
160
|
)
|
159
161
|
if not domain_pattern.match(self.domain):
|
160
162
|
raise ValidationError({'domain': 'Invalid domain format'})
|
161
|
-
|
163
|
+
|
162
164
|
# Validate zone_id format (Cloudflare zone IDs are 32 chars)
|
163
165
|
if len(self.zone_id) != 32:
|
164
166
|
raise ValidationError({'zone_id': 'Zone ID must be 32 characters'})
|