django-cfg 1.4.20__py3-none-any.whl → 1.4.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/migrations/0003_alter_documentarchive_archive_type.py +29 -0
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +35 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +36 -35
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +12 -13
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.20.dist-info/RECORD +0 -1110
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -4,11 +4,11 @@ Django CFG Default Pagination Classes
|
|
4
4
|
Provides enhanced pagination classes with better response format and schema support.
|
5
5
|
"""
|
6
6
|
|
7
|
-
|
8
|
-
from rest_framework.response import Response
|
9
|
-
from typing import Dict, Any, Optional
|
7
|
+
|
10
8
|
from django.core.paginator import InvalidPage
|
11
9
|
from rest_framework.exceptions import NotFound
|
10
|
+
from rest_framework.pagination import PageNumberPagination
|
11
|
+
from rest_framework.response import Response
|
12
12
|
|
13
13
|
|
14
14
|
class DefaultPagination(PageNumberPagination):
|
@@ -21,15 +21,15 @@ class DefaultPagination(PageNumberPagination):
|
|
21
21
|
- Better OpenAPI schema support
|
22
22
|
- Consistent error handling
|
23
23
|
"""
|
24
|
-
|
24
|
+
|
25
25
|
# Page size configuration
|
26
26
|
page_size = 100
|
27
27
|
page_size_query_param = 'page_size'
|
28
28
|
max_page_size = 1000
|
29
|
-
|
29
|
+
|
30
30
|
# Page number configuration
|
31
31
|
page_query_param = 'page'
|
32
|
-
|
32
|
+
|
33
33
|
# Template for invalid page messages
|
34
34
|
invalid_page_message = 'Invalid page "{page_number}": {message}.'
|
35
35
|
|
@@ -97,7 +97,7 @@ class DefaultPagination(PageNumberPagination):
|
|
97
97
|
'example': 2
|
98
98
|
},
|
99
99
|
'pages': {
|
100
|
-
'type': 'integer',
|
100
|
+
'type': 'integer',
|
101
101
|
'description': 'Total number of pages',
|
102
102
|
'example': 15
|
103
103
|
},
|
@@ -251,7 +251,7 @@ class CursorPaginationEnhanced(PageNumberPagination):
|
|
251
251
|
# Export all pagination classes
|
252
252
|
__all__ = [
|
253
253
|
'DefaultPagination',
|
254
|
-
'LargePagination',
|
254
|
+
'LargePagination',
|
255
255
|
'SmallPagination',
|
256
256
|
'NoPagination',
|
257
257
|
'CursorPaginationEnhanced',
|
@@ -7,7 +7,8 @@ authentication errors on endpoints with AllowAny permissions.
|
|
7
7
|
|
8
8
|
import logging
|
9
9
|
import re
|
10
|
-
from typing import List, Optional
|
10
|
+
from typing import List, Optional
|
11
|
+
|
11
12
|
from django.http import HttpRequest, HttpResponse
|
12
13
|
from django.utils.deprecation import MiddlewareMixin
|
13
14
|
|
@@ -28,7 +29,7 @@ class PublicEndpointsMiddleware(MiddlewareMixin):
|
|
28
29
|
- ✅ Detailed logging for debugging
|
29
30
|
- ✅ Performance optimized with compiled regex patterns
|
30
31
|
"""
|
31
|
-
|
32
|
+
|
32
33
|
# Default public endpoint patterns
|
33
34
|
DEFAULT_PUBLIC_PATTERNS = [
|
34
35
|
r'^/api/accounts/otp/', # OTP endpoints (request, verify)
|
@@ -41,7 +42,7 @@ class PublicEndpointsMiddleware(MiddlewareMixin):
|
|
41
42
|
r'^/api/schema/', # API schema endpoints
|
42
43
|
r'^/api/docs/', # API documentation
|
43
44
|
]
|
44
|
-
|
45
|
+
|
45
46
|
def __init__(self, get_response=None):
|
46
47
|
super().__init__(get_response)
|
47
48
|
self.public_patterns: List[re.Pattern] = []
|
@@ -51,71 +52,71 @@ class PublicEndpointsMiddleware(MiddlewareMixin):
|
|
51
52
|
'public_endpoints_hit': 0,
|
52
53
|
}
|
53
54
|
self._compile_patterns()
|
54
|
-
|
55
|
+
|
55
56
|
def _compile_patterns(self):
|
56
57
|
"""Compile regex patterns for better performance."""
|
57
58
|
patterns = self._get_public_patterns()
|
58
59
|
self.public_patterns = [re.compile(pattern) for pattern in patterns]
|
59
60
|
logger.debug(f"Compiled {len(self.public_patterns)} public endpoint patterns")
|
60
|
-
|
61
|
+
|
61
62
|
def _get_public_patterns(self) -> List[str]:
|
62
63
|
"""Get public endpoint patterns from Django settings or use defaults."""
|
63
64
|
from django.conf import settings
|
64
|
-
|
65
|
+
|
65
66
|
# Try to get patterns from settings
|
66
67
|
custom_patterns = getattr(settings, 'PUBLIC_ENDPOINT_PATTERNS', None)
|
67
68
|
if custom_patterns:
|
68
69
|
logger.debug(f"Using custom public patterns: {len(custom_patterns)} patterns")
|
69
70
|
return custom_patterns
|
70
|
-
|
71
|
+
|
71
72
|
# Use defaults
|
72
73
|
logger.debug(f"Using default public patterns: {len(self.DEFAULT_PUBLIC_PATTERNS)} patterns")
|
73
74
|
return self.DEFAULT_PUBLIC_PATTERNS
|
74
|
-
|
75
|
+
|
75
76
|
def _is_public_endpoint(self, path: str) -> bool:
|
76
77
|
"""Check if the request path matches any public endpoint pattern."""
|
77
78
|
for pattern in self.public_patterns:
|
78
79
|
if pattern.match(path):
|
79
80
|
return True
|
80
81
|
return False
|
81
|
-
|
82
|
+
|
82
83
|
def _has_jwt_token(self, request: HttpRequest) -> bool:
|
83
84
|
"""Check if request has a JWT Authorization header."""
|
84
85
|
auth_header = request.META.get('HTTP_AUTHORIZATION', '')
|
85
86
|
return auth_header.startswith('Bearer ')
|
86
|
-
|
87
|
+
|
87
88
|
def _extract_auth_header(self, request: HttpRequest) -> Optional[str]:
|
88
89
|
"""Extract and remove Authorization header from request."""
|
89
90
|
return request.META.pop('HTTP_AUTHORIZATION', None)
|
90
|
-
|
91
|
+
|
91
92
|
def _restore_auth_header(self, request: HttpRequest, auth_header: str):
|
92
93
|
"""Restore Authorization header to request."""
|
93
94
|
if auth_header:
|
94
95
|
request.META['HTTP_AUTHORIZATION'] = auth_header
|
95
|
-
|
96
|
+
|
96
97
|
def process_request(self, request: HttpRequest) -> Optional[HttpResponse]:
|
97
98
|
"""
|
98
99
|
Process incoming request and temporarily remove auth header for public endpoints.
|
99
100
|
"""
|
100
101
|
self.stats['requests_processed'] += 1
|
101
|
-
|
102
|
+
|
102
103
|
# Check if this is a public endpoint
|
103
104
|
if not self._is_public_endpoint(request.path):
|
104
105
|
return None
|
105
|
-
|
106
|
+
|
106
107
|
self.stats['public_endpoints_hit'] += 1
|
107
|
-
|
108
|
+
|
108
109
|
# Check if request has JWT token
|
109
110
|
if not self._has_jwt_token(request):
|
110
111
|
return None
|
111
|
-
|
112
|
+
|
112
113
|
# Store the auth header and remove it temporarily
|
113
114
|
auth_header = self._extract_auth_header(request)
|
114
115
|
if auth_header:
|
115
116
|
self.stats['tokens_ignored'] += 1
|
116
117
|
# Store in request for restoration later
|
117
118
|
request._original_auth_header = auth_header
|
118
|
-
|
119
|
+
|
119
120
|
logger.debug(
|
120
121
|
f"Temporarily removed auth header for public endpoint: {request.path}",
|
121
122
|
extra={
|
@@ -124,9 +125,9 @@ class PublicEndpointsMiddleware(MiddlewareMixin):
|
|
124
125
|
'has_token': bool(auth_header),
|
125
126
|
}
|
126
127
|
)
|
127
|
-
|
128
|
+
|
128
129
|
return None
|
129
|
-
|
130
|
+
|
130
131
|
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse:
|
131
132
|
"""
|
132
133
|
Restore Authorization header after request processing.
|
@@ -135,7 +136,7 @@ class PublicEndpointsMiddleware(MiddlewareMixin):
|
|
135
136
|
if hasattr(request, '_original_auth_header'):
|
136
137
|
self._restore_auth_header(request, request._original_auth_header)
|
137
138
|
delattr(request, '_original_auth_header')
|
138
|
-
|
139
|
+
|
139
140
|
logger.debug(
|
140
141
|
f"Restored auth header for public endpoint: {request.path}",
|
141
142
|
extra={
|
@@ -143,9 +144,9 @@ class PublicEndpointsMiddleware(MiddlewareMixin):
|
|
143
144
|
'status_code': response.status_code,
|
144
145
|
}
|
145
146
|
)
|
146
|
-
|
147
|
+
|
147
148
|
return response
|
148
|
-
|
149
|
+
|
149
150
|
def get_stats(self) -> dict:
|
150
151
|
"""Get middleware statistics."""
|
151
152
|
return {
|
@@ -153,7 +154,7 @@ class PublicEndpointsMiddleware(MiddlewareMixin):
|
|
153
154
|
'public_patterns_count': len(self.public_patterns),
|
154
155
|
'middleware_active': True,
|
155
156
|
}
|
156
|
-
|
157
|
+
|
157
158
|
def reset_stats(self):
|
158
159
|
"""Reset middleware statistics."""
|
159
160
|
self.stats = {
|
@@ -6,9 +6,11 @@ making API requests. Only works when accounts app is enabled.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
import logging
|
9
|
-
|
9
|
+
|
10
10
|
from django.contrib.auth import get_user_model
|
11
|
+
from django.utils import timezone
|
11
12
|
from django.utils.deprecation import MiddlewareMixin
|
13
|
+
|
12
14
|
from django_cfg.modules.base import BaseCfgModule
|
13
15
|
|
14
16
|
logger = logging.getLogger(__name__)
|
@@ -27,20 +29,20 @@ class UserActivityMiddleware(MiddlewareMixin, BaseCfgModule):
|
|
27
29
|
- Only works when accounts app is enabled
|
28
30
|
- KISS principle - no configuration needed
|
29
31
|
"""
|
30
|
-
|
32
|
+
|
31
33
|
def __init__(self, get_response=None):
|
32
34
|
"""Initialize the middleware."""
|
33
35
|
super().__init__(get_response)
|
34
36
|
BaseCfgModule.__init__(self)
|
35
37
|
self.get_response = get_response
|
36
|
-
|
38
|
+
|
37
39
|
# Cache for tracking last update times (in memory)
|
38
40
|
self._last_updates = {}
|
39
|
-
|
41
|
+
|
40
42
|
# Fixed configuration - KISS principle
|
41
43
|
self.update_interval = 300 # 5 minutes
|
42
44
|
self.api_only = True # Only track API requests
|
43
|
-
|
45
|
+
|
44
46
|
def process_request(self, request):
|
45
47
|
"""
|
46
48
|
Process incoming request to track user activity.
|
@@ -51,23 +53,23 @@ class UserActivityMiddleware(MiddlewareMixin, BaseCfgModule):
|
|
51
53
|
# Only process if accounts app is enabled
|
52
54
|
if not self.is_accounts_enabled():
|
53
55
|
return None
|
54
|
-
|
56
|
+
|
55
57
|
# Only track authenticated users
|
56
58
|
if not hasattr(request, 'user') or not request.user.is_authenticated:
|
57
59
|
return None
|
58
|
-
|
60
|
+
|
59
61
|
# Only track API requests if api_only is enabled
|
60
62
|
if self.api_only and not self._is_api_request(request):
|
61
63
|
return None
|
62
|
-
|
64
|
+
|
63
65
|
try:
|
64
66
|
self._update_user_activity(request.user, request)
|
65
67
|
except Exception as e:
|
66
68
|
# Log error but don't break the request
|
67
69
|
logger.warning(f"Failed to update user activity: {e}")
|
68
|
-
|
70
|
+
|
69
71
|
return None
|
70
|
-
|
72
|
+
|
71
73
|
def _is_api_request(self, request):
|
72
74
|
"""
|
73
75
|
Check if this is an API request using intelligent detection.
|
@@ -81,23 +83,23 @@ class UserActivityMiddleware(MiddlewareMixin, BaseCfgModule):
|
|
81
83
|
# Primary detection: Check for JSON-related indicators
|
82
84
|
content_type = request.content_type or ''
|
83
85
|
accept_header = request.META.get('HTTP_ACCEPT', '')
|
84
|
-
|
86
|
+
|
85
87
|
# 1. JSON Content-Type or Accept header
|
86
|
-
if ('application/json' in content_type or
|
88
|
+
if ('application/json' in content_type or
|
87
89
|
'application/json' in accept_header):
|
88
90
|
return True
|
89
|
-
|
91
|
+
|
90
92
|
# 2. DRF format parameter
|
91
93
|
if request.GET.get('format') in ['json', 'api']:
|
92
94
|
return True
|
93
|
-
|
95
|
+
|
94
96
|
# 3. Common REST API HTTP methods with specific paths
|
95
97
|
if request.method in ['POST', 'PUT', 'PATCH', 'DELETE']:
|
96
98
|
path = request.path_info
|
97
99
|
# Only track REST operations, not form submissions
|
98
100
|
if not path.endswith('/') or 'admin' not in path:
|
99
101
|
return True
|
100
|
-
|
102
|
+
|
101
103
|
# 4. Check if path matches configured API prefixes
|
102
104
|
path = request.path_info
|
103
105
|
try:
|
@@ -108,7 +110,7 @@ class UserActivityMiddleware(MiddlewareMixin, BaseCfgModule):
|
|
108
110
|
api_prefix = f"/{getattr(config.openapi_client, 'api_prefix', 'api')}/"
|
109
111
|
if path.startswith(api_prefix):
|
110
112
|
return True
|
111
|
-
|
113
|
+
|
112
114
|
# Check Django CFG prefix (always /cfg/ by default)
|
113
115
|
if path.startswith('/cfg/'):
|
114
116
|
return True
|
@@ -116,9 +118,9 @@ class UserActivityMiddleware(MiddlewareMixin, BaseCfgModule):
|
|
116
118
|
# Fallback to basic path detection
|
117
119
|
if path.startswith(('/api/', '/cfg/')):
|
118
120
|
return True
|
119
|
-
|
121
|
+
|
120
122
|
return False
|
121
|
-
|
123
|
+
|
122
124
|
def _update_user_activity(self, user, request):
|
123
125
|
"""
|
124
126
|
Update user's last_login field if enough time has passed.
|
@@ -129,33 +131,33 @@ class UserActivityMiddleware(MiddlewareMixin, BaseCfgModule):
|
|
129
131
|
"""
|
130
132
|
now = timezone.now()
|
131
133
|
user_id = user.pk
|
132
|
-
|
134
|
+
|
133
135
|
# Check if we should update (avoid database spam)
|
134
136
|
last_update = self._last_updates.get(user_id)
|
135
137
|
if last_update and (now - last_update).total_seconds() < self.update_interval:
|
136
138
|
return
|
137
|
-
|
139
|
+
|
138
140
|
# Update user's last_login
|
139
141
|
User = get_user_model()
|
140
142
|
try:
|
141
143
|
# Use update() to avoid triggering signals and save() overhead
|
142
144
|
User.objects.filter(pk=user_id).update(last_login=now)
|
143
|
-
|
145
|
+
|
144
146
|
# Cache the update time
|
145
147
|
self._last_updates[user_id] = now
|
146
|
-
|
148
|
+
|
147
149
|
# Log the activity (optional, for debugging)
|
148
150
|
logger.debug(f"Updated last_login for user {user.email} from {request.path}")
|
149
|
-
|
151
|
+
|
150
152
|
# Clean up old cache entries (keep only last 1000 users)
|
151
153
|
if len(self._last_updates) > 1000:
|
152
154
|
# Remove oldest entries
|
153
155
|
sorted_items = sorted(self._last_updates.items(), key=lambda x: x[1])
|
154
156
|
self._last_updates = dict(sorted_items[-500:])
|
155
|
-
|
157
|
+
|
156
158
|
except Exception as e:
|
157
159
|
logger.error(f"Failed to update last_login for user {user_id}: {e}")
|
158
|
-
|
160
|
+
|
159
161
|
def get_activity_stats(self):
|
160
162
|
"""
|
161
163
|
Get middleware activity statistics.
|
django_cfg/models/__init__.py
CHANGED
@@ -15,46 +15,45 @@ Organized by category:
|
|
15
15
|
"""
|
16
16
|
|
17
17
|
# Base classes
|
18
|
-
|
19
|
-
from .
|
20
|
-
|
21
|
-
# Infrastructure
|
22
|
-
from .infrastructure.database import DatabaseConfig
|
23
|
-
from .infrastructure.cache import CacheConfig
|
24
|
-
from .infrastructure.logging import LoggingConfig
|
25
|
-
from .infrastructure.security import SecurityConfig
|
18
|
+
# External modules (imported from other locations)
|
19
|
+
from ..modules.django_unfold.models.config import UnfoldConfig
|
26
20
|
|
27
21
|
# API & Authentication
|
28
22
|
from .api.config import APIConfig
|
29
|
-
from .api.keys import ApiKeys
|
30
|
-
from .api.jwt import JWTConfig
|
31
23
|
from .api.cors import CORSConfig
|
32
|
-
from .api.limits import LimitsConfig
|
33
24
|
from .api.drf.config import DRFConfig
|
25
|
+
from .api.drf.redoc import RedocUISettings
|
34
26
|
from .api.drf.spectacular import SpectacularConfig
|
35
27
|
from .api.drf.swagger import SwaggerUISettings
|
36
|
-
from .api.
|
28
|
+
from .api.jwt import JWTConfig
|
29
|
+
from .api.keys import ApiKeys
|
30
|
+
from .api.limits import LimitsConfig
|
31
|
+
from .base.config import BaseConfig, BaseSettings
|
32
|
+
from .base.module import BaseCfgAutoModule
|
33
|
+
from .django.constance import ConstanceConfig, ConstanceField
|
37
34
|
|
38
35
|
# Django-specific
|
39
36
|
from .django.environment import EnvironmentConfig
|
40
|
-
from .django.constance import ConstanceConfig, ConstanceField
|
41
37
|
from .django.openapi import OpenAPIClientConfig
|
38
|
+
from .infrastructure.cache import CacheConfig
|
42
39
|
|
43
|
-
#
|
44
|
-
from .
|
45
|
-
from .
|
46
|
-
from .
|
47
|
-
from .ngrok.config import NgrokConfig
|
40
|
+
# Infrastructure
|
41
|
+
from .infrastructure.database import DatabaseConfig
|
42
|
+
from .infrastructure.logging import LoggingConfig
|
43
|
+
from .infrastructure.security import SecurityConfig
|
48
44
|
from .ngrok.auth import NgrokAuthConfig
|
45
|
+
from .ngrok.config import NgrokConfig
|
49
46
|
from .ngrok.tunnel import NgrokTunnelConfig
|
50
47
|
|
51
48
|
# Payments
|
52
49
|
from .payments.config import PaymentsConfig
|
53
50
|
from .payments.providers.base import BaseProviderConfig
|
54
51
|
from .payments.providers.nowpayments import NowPaymentsProviderConfig
|
52
|
+
from .services.base import ServiceConfig
|
55
53
|
|
56
|
-
#
|
57
|
-
from
|
54
|
+
# Services
|
55
|
+
from .services.email import EmailConfig
|
56
|
+
from .services.telegram import TelegramConfig
|
58
57
|
|
59
58
|
__all__ = [
|
60
59
|
# Base
|
@@ -5,14 +5,14 @@ API, authentication, and documentation configuration.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
from .config import APIConfig
|
8
|
-
from .keys import ApiKeys
|
9
|
-
from .jwt import JWTConfig
|
10
8
|
from .cors import CORSConfig
|
11
|
-
from .limits import LimitsConfig
|
12
9
|
from .drf.config import DRFConfig
|
10
|
+
from .drf.redoc import RedocUISettings
|
13
11
|
from .drf.spectacular import SpectacularConfig
|
14
12
|
from .drf.swagger import SwaggerUISettings
|
15
|
-
from .
|
13
|
+
from .jwt import JWTConfig
|
14
|
+
from .keys import ApiKeys
|
15
|
+
from .limits import LimitsConfig
|
16
16
|
|
17
17
|
__all__ = [
|
18
18
|
"APIConfig",
|
django_cfg/models/api/config.py
CHANGED
@@ -4,8 +4,10 @@ API Configuration Model
|
|
4
4
|
Django REST Framework and API settings with Pydantic 2.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from typing import
|
7
|
+
from typing import Any, Dict, List
|
8
|
+
|
8
9
|
from pydantic import Field, field_validator
|
10
|
+
|
9
11
|
from ..base import BaseConfig
|
10
12
|
|
11
13
|
|
@@ -16,7 +18,7 @@ class APIConfig(BaseConfig):
|
|
16
18
|
Configures Django REST Framework, pagination, throttling,
|
17
19
|
and API documentation settings.
|
18
20
|
"""
|
19
|
-
|
21
|
+
|
20
22
|
# Pagination settings
|
21
23
|
page_size: int = Field(
|
22
24
|
default=20,
|
@@ -24,52 +26,52 @@ class APIConfig(BaseConfig):
|
|
24
26
|
le=100,
|
25
27
|
description="Default API pagination page size"
|
26
28
|
)
|
27
|
-
|
29
|
+
|
28
30
|
max_page_size: int = Field(
|
29
31
|
default=100,
|
30
32
|
ge=1,
|
31
33
|
le=1000,
|
32
34
|
description="Maximum API pagination page size"
|
33
35
|
)
|
34
|
-
|
36
|
+
|
35
37
|
# Throttling settings
|
36
38
|
rate_limit_enabled: bool = Field(
|
37
39
|
default=True,
|
38
40
|
description="Enable API rate limiting"
|
39
41
|
)
|
40
|
-
|
42
|
+
|
41
43
|
rate_limit_anon: str = Field(
|
42
44
|
default="100/hour",
|
43
45
|
description="Rate limit for anonymous users"
|
44
46
|
)
|
45
|
-
|
47
|
+
|
46
48
|
rate_limit_user: str = Field(
|
47
|
-
default="1000/hour",
|
49
|
+
default="1000/hour",
|
48
50
|
description="Rate limit for authenticated users"
|
49
51
|
)
|
50
|
-
|
52
|
+
|
51
53
|
# Documentation settings
|
52
54
|
docs_enabled: bool = Field(
|
53
55
|
default=True,
|
54
56
|
description="Enable API documentation"
|
55
57
|
)
|
56
|
-
|
58
|
+
|
57
59
|
docs_title: str = Field(
|
58
60
|
default="API Documentation",
|
59
61
|
description="API documentation title"
|
60
62
|
)
|
61
|
-
|
63
|
+
|
62
64
|
docs_version: str = Field(
|
63
65
|
default="v1",
|
64
66
|
description="API version"
|
65
67
|
)
|
66
|
-
|
68
|
+
|
67
69
|
# CORS settings for API
|
68
70
|
api_cors_origins: List[str] = Field(
|
69
71
|
default_factory=list,
|
70
72
|
description="CORS origins specifically for API endpoints"
|
71
73
|
)
|
72
|
-
|
74
|
+
|
73
75
|
@field_validator('page_size', 'max_page_size')
|
74
76
|
@classmethod
|
75
77
|
def validate_page_sizes(cls, v: int) -> int:
|
@@ -77,7 +79,7 @@ class APIConfig(BaseConfig):
|
|
77
79
|
if v <= 0:
|
78
80
|
raise ValueError("Page size must be positive")
|
79
81
|
return v
|
80
|
-
|
82
|
+
|
81
83
|
@field_validator('rate_limit_anon', 'rate_limit_user')
|
82
84
|
@classmethod
|
83
85
|
def validate_rate_limits(cls, v: str) -> str:
|
@@ -87,7 +89,7 @@ class APIConfig(BaseConfig):
|
|
87
89
|
if not re.match(pattern, v):
|
88
90
|
raise ValueError("Rate limit must be in format: number/(second|minute|hour|day)")
|
89
91
|
return v
|
90
|
-
|
92
|
+
|
91
93
|
def to_django_settings(self) -> Dict[str, Any]:
|
92
94
|
"""Convert to Django REST Framework settings."""
|
93
95
|
settings = {
|
@@ -95,22 +97,22 @@ class APIConfig(BaseConfig):
|
|
95
97
|
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
|
96
98
|
'PAGE_SIZE': self.page_size,
|
97
99
|
'MAX_PAGE_SIZE': self.max_page_size,
|
98
|
-
|
100
|
+
|
99
101
|
'DEFAULT_AUTHENTICATION_CLASSES': [
|
100
102
|
'rest_framework.authentication.SessionAuthentication',
|
101
103
|
'rest_framework.authentication.TokenAuthentication',
|
102
104
|
'rest_framework_simplejwt.authentication.JWTAuthentication',
|
103
105
|
],
|
104
|
-
|
106
|
+
|
105
107
|
'DEFAULT_PERMISSION_CLASSES': [
|
106
108
|
'rest_framework.permissions.IsAuthenticated',
|
107
109
|
],
|
108
|
-
|
110
|
+
|
109
111
|
'DEFAULT_RENDERER_CLASSES': [
|
110
112
|
'rest_framework.renderers.JSONRenderer',
|
111
113
|
'rest_framework.renderers.BrowsableAPIRenderer',
|
112
114
|
],
|
113
|
-
|
115
|
+
|
114
116
|
'DEFAULT_FILTER_BACKENDS': [
|
115
117
|
'django_filters.rest_framework.DjangoFilterBackend',
|
116
118
|
'rest_framework.filters.OrderingFilter',
|
@@ -118,7 +120,7 @@ class APIConfig(BaseConfig):
|
|
118
120
|
],
|
119
121
|
}
|
120
122
|
}
|
121
|
-
|
123
|
+
|
122
124
|
# Add throttling if enabled
|
123
125
|
if self.rate_limit_enabled:
|
124
126
|
settings['REST_FRAMEWORK']['DEFAULT_THROTTLE_CLASSES'] = [
|
@@ -129,7 +131,7 @@ class APIConfig(BaseConfig):
|
|
129
131
|
'anon': self.rate_limit_anon,
|
130
132
|
'user': self.rate_limit_user,
|
131
133
|
}
|
132
|
-
|
134
|
+
|
133
135
|
# API documentation settings
|
134
136
|
if self.docs_enabled:
|
135
137
|
settings.update({
|
@@ -141,5 +143,5 @@ class APIConfig(BaseConfig):
|
|
141
143
|
'SCHEMA_PATH_PREFIX': '/api/',
|
142
144
|
}
|
143
145
|
})
|
144
|
-
|
146
|
+
|
145
147
|
return settings
|