django-cfg 1.3.11__py3-none-any.whl → 1.4.0__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 +1 -1
- django_cfg/apps/accounts/admin/inlines.py +11 -5
- django_cfg/apps/accounts/admin/user_admin.py +39 -16
- django_cfg/apps/accounts/serializers/profile.py +1 -1
- django_cfg/apps/accounts/services/otp_service.py +18 -11
- django_cfg/apps/accounts/signals.py +15 -24
- django_cfg/apps/accounts/utils/notifications.py +217 -358
- django_cfg/apps/accounts/views/otp.py +2 -2
- django_cfg/apps/accounts/views/webhook.py +1 -1
- django_cfg/apps/agents/core/django_agent.py +1 -1
- django_cfg/apps/api/commands/views.py +66 -83
- django_cfg/apps/api/health/drf_views.py +269 -0
- django_cfg/apps/api/health/serializers.py +45 -0
- django_cfg/apps/api/health/urls.py +6 -1
- django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
- django_cfg/apps/knowbase/admin/document_admin.py +136 -270
- django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
- django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
- django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
- django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
- django_cfg/apps/knowbase/config/constance_fields.py +1 -1
- django_cfg/apps/knowbase/config/settings.py +2 -2
- django_cfg/apps/knowbase/mixins/__init__.py +19 -2
- django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
- django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
- django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
- django_cfg/apps/knowbase/mixins/creator.py +10 -10
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
- django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
- django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
- django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
- django_cfg/apps/knowbase/mixins/service.py +2 -2
- django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
- django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
- django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
- django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
- django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
- django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
- django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
- django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
- django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
- django_cfg/apps/knowbase/services/embedding/models.py +18 -14
- django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
- django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
- django_cfg/apps/leads/tests.py +1 -1
- django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
- django_cfg/apps/payments/admin/balance_admin.py +1 -1
- django_cfg/apps/payments/admin/currencies_admin.py +1 -1
- django_cfg/apps/payments/admin/payments_admin.py +1 -1
- django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
- django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
- django_cfg/apps/payments/admin_interface/views/base.py +29 -2
- django_cfg/apps/payments/apps.py +1 -1
- django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
- django_cfg/apps/payments/config/helpers.py +3 -2
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
- django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
- django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
- django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
- django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
- django_cfg/apps/payments/management/commands/test_providers.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +1 -1
- django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
- django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
- django_cfg/apps/payments/models/balance.py +2 -2
- django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
- django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
- django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
- django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
- django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
- django_cfg/apps/payments/models/payments.py +2 -2
- django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
- django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
- django_cfg/apps/payments/services/core/base.py +1 -1
- django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
- django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
- django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
- django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
- django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
- django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
- django_cfg/apps/payments/services/core/payment_service.py +124 -612
- django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
- django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
- django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
- django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
- django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
- django_cfg/apps/payments/services/providers/base.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
- django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
- django_cfg/apps/payments/services/providers/registry.py +1 -1
- django_cfg/apps/payments/services/providers/sync_service.py +1 -1
- django_cfg/apps/payments/signals/__init__.py +1 -1
- django_cfg/apps/payments/signals/api_key_signals.py +1 -1
- django_cfg/apps/payments/signals/balance_signals.py +1 -1
- django_cfg/apps/payments/signals/payment_signals.py +1 -1
- django_cfg/apps/payments/signals/subscription_signals.py +1 -1
- django_cfg/apps/payments/views/api/api_keys.py +1 -1
- django_cfg/apps/payments/views/api/balances.py +1 -1
- django_cfg/apps/payments/views/api/base.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +1 -1
- django_cfg/apps/payments/views/api/payments.py +1 -1
- django_cfg/apps/payments/views/api/subscriptions.py +1 -1
- django_cfg/apps/payments/views/api/webhooks.py +1 -1
- django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
- django_cfg/apps/payments/views/serializers/balances.py +1 -1
- django_cfg/apps/payments/views/serializers/currencies.py +1 -1
- django_cfg/apps/payments/views/serializers/payments.py +1 -1
- django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
- django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
- django_cfg/apps/support/admin/support_admin.py +21 -13
- django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
- django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
- django_cfg/apps/support/utils/support_email_service.py +1 -1
- django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
- django_cfg/apps/tasks/utils/simulator.py +1 -1
- django_cfg/apps/tasks/views/dashboard.py +33 -3
- django_cfg/apps/urls.py +5 -1
- django_cfg/cli/README.md +57 -471
- django_cfg/cli/commands/create_project.py +140 -529
- django_cfg/cli/main.py +13 -10
- django_cfg/core/__init__.py +63 -6
- django_cfg/core/base/__init__.py +5 -0
- django_cfg/core/base/config_model.py +652 -0
- django_cfg/core/builders/__init__.py +11 -0
- django_cfg/core/builders/apps_builder.py +258 -0
- django_cfg/core/builders/middleware_builder.py +115 -0
- django_cfg/core/builders/security_builder.py +96 -0
- django_cfg/core/config.py +20 -892
- django_cfg/core/constants.py +69 -0
- django_cfg/core/environment/__init__.py +9 -0
- django_cfg/core/exceptions.py +45 -298
- django_cfg/core/generation/__init__.py +51 -0
- django_cfg/core/generation/core_generators/__init__.py +0 -0
- django_cfg/core/generation/core_generators/settings.py +90 -0
- django_cfg/core/generation/core_generators/static.py +82 -0
- django_cfg/core/generation/core_generators/templates.py +141 -0
- django_cfg/core/generation/data_generators/__init__.py +15 -0
- django_cfg/core/generation/data_generators/cache.py +132 -0
- django_cfg/core/generation/data_generators/database.py +117 -0
- django_cfg/core/generation/generation.py +92 -0
- django_cfg/core/generation/integration_generators/__init__.py +21 -0
- django_cfg/core/generation/integration_generators/api.py +237 -0
- django_cfg/core/generation/integration_generators/sessions.py +65 -0
- django_cfg/core/generation/integration_generators/tailwind.py +54 -0
- django_cfg/core/generation/integration_generators/tasks.py +92 -0
- django_cfg/core/generation/integration_generators/third_party.py +144 -0
- django_cfg/core/generation/orchestrator.py +285 -0
- django_cfg/core/generation/protocols.py +30 -0
- django_cfg/core/generation/security_generators/__init__.py +0 -0
- django_cfg/core/generation/utility_generators/__init__.py +24 -0
- django_cfg/core/generation/utility_generators/email.py +58 -0
- django_cfg/core/generation/utility_generators/i18n.py +66 -0
- django_cfg/core/generation/utility_generators/limits.py +58 -0
- django_cfg/core/generation/utility_generators/logging.py +66 -0
- django_cfg/core/generation/utility_generators/security.py +101 -0
- django_cfg/core/generation/utils/__init__.py +0 -0
- django_cfg/core/generation/utils/helpers.py +32 -0
- django_cfg/core/integration/__init__.py +18 -25
- django_cfg/core/integration/display/startup.py +146 -133
- django_cfg/core/integration/url_integration.py +13 -2
- django_cfg/core/services/__init__.py +5 -0
- django_cfg/core/services/config_service.py +121 -0
- django_cfg/core/state/__init__.py +9 -0
- django_cfg/core/state/registry.py +84 -0
- django_cfg/core/types/__init__.py +15 -0
- django_cfg/core/types/aliases.py +15 -0
- django_cfg/core/types/enums.py +49 -0
- django_cfg/dashboard/DEBUG_README.md +105 -0
- django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
- django_cfg/dashboard/__init__.py +24 -0
- django_cfg/dashboard/components.py +308 -0
- django_cfg/dashboard/debug.py +176 -0
- django_cfg/dashboard/management/__init__.py +0 -0
- django_cfg/dashboard/management/commands/__init__.py +0 -0
- django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
- django_cfg/dashboard/sections/__init__.py +1 -0
- django_cfg/dashboard/sections/base.py +128 -0
- django_cfg/dashboard/sections/commands.py +32 -0
- django_cfg/dashboard/sections/overview.py +394 -0
- django_cfg/dashboard/sections/stats.py +48 -0
- django_cfg/dashboard/sections/system.py +73 -0
- django_cfg/management/commands/check_settings.py +6 -2
- django_cfg/management/commands/clear_constance.py +6 -1
- django_cfg/management/commands/create_token.py +5 -4
- django_cfg/management/commands/generate.py +5 -0
- django_cfg/management/commands/list_urls.py +7 -2
- django_cfg/management/commands/migrate_all.py +6 -2
- django_cfg/management/commands/migrator.py +6 -1
- django_cfg/management/commands/rundramatiq.py +6 -1
- django_cfg/management/commands/rundramatiq_simulator.py +11 -4
- django_cfg/management/commands/runserver_ngrok.py +9 -7
- django_cfg/management/commands/script.py +25 -21
- django_cfg/management/commands/show_config.py +6 -1
- django_cfg/management/commands/show_urls.py +8 -3
- django_cfg/management/commands/superuser.py +5 -4
- django_cfg/management/commands/task_clear.py +8 -3
- django_cfg/management/commands/task_status.py +8 -3
- django_cfg/management/commands/test_email.py +6 -1
- django_cfg/management/commands/test_telegram.py +6 -1
- django_cfg/management/commands/test_twilio.py +6 -1
- django_cfg/management/commands/tree.py +7 -4
- django_cfg/models/__init__.py +88 -3
- django_cfg/models/api/__init__.py +27 -0
- django_cfg/models/{api.py → api/config.py} +1 -1
- django_cfg/models/api/drf/__init__.py +21 -0
- django_cfg/models/api/drf/config.py +101 -0
- django_cfg/models/api/drf/redoc.py +31 -0
- django_cfg/models/api/drf/spectacular.py +129 -0
- django_cfg/models/api/drf/swagger.py +59 -0
- django_cfg/models/{api_keys.py → api/keys.py} +16 -6
- django_cfg/models/{limits.py → api/limits.py} +0 -1
- django_cfg/models/base/__init__.py +14 -0
- django_cfg/models/django/__init__.py +16 -0
- django_cfg/models/{constance.py → django/constance.py} +1 -1
- django_cfg/models/{environment.py → django/environment.py} +1 -1
- django_cfg/models/infrastructure/__init__.py +17 -0
- django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
- django_cfg/models/infrastructure/database/__init__.py +22 -0
- django_cfg/models/infrastructure/database/config.py +265 -0
- django_cfg/models/infrastructure/database/converters.py +91 -0
- django_cfg/models/infrastructure/database/parsers.py +96 -0
- django_cfg/models/infrastructure/database/routing.py +85 -0
- django_cfg/models/infrastructure/database/validators.py +170 -0
- django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
- django_cfg/models/{security.py → infrastructure/security.py} +2 -2
- django_cfg/models/ngrok/__init__.py +11 -0
- django_cfg/models/ngrok/auth.py +37 -0
- django_cfg/models/ngrok/config.py +77 -0
- django_cfg/models/ngrok/tunnel.py +35 -0
- django_cfg/models/payments/__init__.py +20 -0
- django_cfg/models/payments/api_keys.py +57 -0
- django_cfg/models/{payments.py → payments/config.py} +56 -154
- django_cfg/models/payments/providers/__init__.py +15 -0
- django_cfg/models/payments/providers/base.py +25 -0
- django_cfg/models/payments/providers/nowpayments.py +48 -0
- django_cfg/models/services/__init__.py +18 -0
- django_cfg/models/services/base.py +65 -0
- django_cfg/models/{email.py → services/email.py} +1 -1
- django_cfg/models/services/telegram.py +172 -0
- django_cfg/models/tasks/__init__.py +51 -0
- django_cfg/models/tasks/backends.py +250 -0
- django_cfg/models/tasks/config.py +314 -0
- django_cfg/models/tasks/utils.py +174 -0
- django_cfg/modules/base.py +18 -3
- django_cfg/modules/django_admin/decorators/actions.py +1 -1
- django_cfg/modules/django_admin/decorators/display.py +1 -1
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
- django_cfg/modules/django_cfg_rpc_client/README.md +346 -0
- django_cfg/modules/django_cfg_rpc_client/__init__.py +51 -0
- django_cfg/modules/django_cfg_rpc_client/client.py +540 -0
- django_cfg/modules/django_cfg_rpc_client/config.py +207 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/README.md +517 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/__init__.py +11 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/apps.py +22 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/monitor.py +435 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/static/django_cfg_rpc_dashboard/js/dashboard.js +373 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/base.html +76 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/dashboard.html +200 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/urls.py +22 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/urls_admin.py +9 -0
- django_cfg/modules/django_cfg_rpc_client/dashboard/views.py +251 -0
- django_cfg/modules/django_cfg_rpc_client/exceptions.py +201 -0
- django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
- django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
- django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
- django_cfg/modules/django_drf_theme/README.md +207 -0
- django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
- django_cfg/modules/django_drf_theme/__init__.py +23 -0
- django_cfg/modules/django_drf_theme/apps.py +15 -0
- django_cfg/modules/django_drf_theme/renderers.py +58 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
- django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
- django_cfg/modules/django_email/__init__.py +14 -0
- django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
- django_cfg/modules/django_email/utils.py +40 -0
- django_cfg/modules/django_health/__init__.py +9 -0
- django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
- django_cfg/modules/django_llm/llm/client.py +155 -550
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
- django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
- django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
- django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
- django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
- django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
- django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
- django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
- django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
- django_cfg/modules/django_llm/translator/translator.py +150 -603
- django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
- django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
- django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
- django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
- django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
- django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
- django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
- django_cfg/modules/django_logging/__init__.py +14 -0
- django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
- django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
- django_cfg/modules/django_ngrok/__init__.py +39 -0
- django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
- django_cfg/modules/django_rpc_old/POETRY.md +344 -0
- django_cfg/modules/django_rpc_old/README.md +397 -0
- django_cfg/modules/django_rpc_old/TESTING.md +358 -0
- django_cfg/modules/django_rpc_old/__init__.py +39 -0
- django_cfg/modules/django_rpc_old/client.py +531 -0
- django_cfg/modules/django_rpc_old/config.py +279 -0
- django_cfg/modules/django_rpc_old/exceptions.py +172 -0
- django_cfg/modules/django_tailwind/README.md +478 -0
- django_cfg/modules/django_tailwind/__init__.py +7 -0
- django_cfg/modules/django_tailwind/apps.py +10 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
- django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
- django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
- django_cfg/modules/django_tasks/__init__.py +29 -0
- django_cfg/modules/django_tasks/factory.py +127 -0
- django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
- django_cfg/modules/django_tasks/settings.py +107 -0
- django_cfg/modules/django_telegram/__init__.py +29 -0
- django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
- django_cfg/modules/django_telegram/utils.py +62 -0
- django_cfg/modules/django_twilio/__init__.py +54 -107
- django_cfg/modules/django_twilio/_imports.py +30 -0
- django_cfg/modules/django_twilio/base.py +192 -0
- django_cfg/modules/django_twilio/email_otp.py +227 -0
- django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
- django_cfg/modules/django_twilio/simple_service.py +1 -2
- django_cfg/modules/django_twilio/sms.py +94 -0
- django_cfg/modules/django_twilio/twilio_service.py +2 -3
- django_cfg/modules/django_twilio/unified.py +310 -0
- django_cfg/modules/django_twilio/utils.py +190 -0
- django_cfg/modules/django_twilio/whatsapp.py +137 -0
- django_cfg/modules/django_unfold/callbacks/base.py +198 -7
- django_cfg/modules/django_unfold/callbacks/main.py +102 -10
- django_cfg/modules/django_unfold/dashboard.py +65 -43
- django_cfg/modules/django_unfold/models/config.py +13 -12
- django_cfg/modules/django_unfold/models/navigation.py +8 -3
- django_cfg/modules/django_unfold/models/tabs.py +2 -2
- django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
- django_cfg/registry/core.py +24 -26
- django_cfg/registry/modules.py +5 -2
- django_cfg/registry/services.py +20 -3
- django_cfg/registry/third_party.py +8 -8
- django_cfg/static/admin/css/dashboard.css +260 -0
- django_cfg/static/admin/js/commands.js +171 -0
- django_cfg/static/admin/js/dashboard.js +126 -0
- django_cfg/templates/admin/components/management_commands.js +375 -0
- django_cfg/templates/admin/components/progress_bar.html +18 -23
- django_cfg/templates/admin/index.html +48 -20
- django_cfg/templates/admin/index_new.html +106 -0
- django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
- django_cfg/templates/admin/sections/commands_section.html +626 -0
- django_cfg/templates/admin/sections/overview_section.html +112 -0
- django_cfg/templates/admin/sections/stats_section.html +35 -0
- django_cfg/templates/admin/sections/system_section.html +99 -0
- django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
- django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
- django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
- django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
- django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
- django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
- django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
- django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
- django_cfg/templatetags/django_cfg.py +7 -1
- django_cfg/utils/smart_defaults.py +4 -4
- django_cfg-1.4.0.dist-info/METADATA +920 -0
- {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/RECORD +425 -196
- django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
- django_cfg/core/generation.py +0 -621
- django_cfg/management/commands/validate_config.py +0 -189
- django_cfg/models/database.py +0 -480
- django_cfg/models/drf.py +0 -272
- django_cfg/models/ngrok.py +0 -122
- django_cfg/models/services.py +0 -440
- django_cfg/models/tasks.py +0 -550
- django_cfg/modules/django_twilio/service.py +0 -942
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/templates/rest_framework/api.html +0 -12
- django_cfg/utils/toolkit.py +0 -703
- django_cfg-1.3.11.dist-info/METADATA +0 -1029
- /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
- /django_cfg/core/{environment.py → environment/detector.py} +0 -0
- /django_cfg/models/{cors.py → api/cors.py} +0 -0
- /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
- /django_cfg/models/{base.py → base/config.py} +0 -0
- /django_cfg/models/{cfg.py → base/module.py} +0 -0
- /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
- /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
- {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -34,38 +34,34 @@ class NgrokManager:
|
|
34
34
|
"""Start ngrok tunnel for given port."""
|
35
35
|
if not self.config.enabled:
|
36
36
|
return None
|
37
|
-
|
37
|
+
|
38
38
|
try:
|
39
39
|
# Import ngrok (may not be available on Python < 3.12)
|
40
40
|
import ngrok
|
41
|
-
|
41
|
+
|
42
42
|
# Get auth token
|
43
|
-
authtoken = self.config.
|
44
|
-
|
43
|
+
authtoken = self.config.get_authtoken()
|
44
|
+
|
45
45
|
# Create tunnel configuration
|
46
46
|
tunnel_config = {
|
47
47
|
"addr": f"http://127.0.0.1:{port}",
|
48
48
|
}
|
49
|
-
|
49
|
+
|
50
50
|
# Add auth token if available
|
51
51
|
if authtoken:
|
52
52
|
tunnel_config["authtoken"] = authtoken
|
53
|
-
|
54
|
-
# Add domain if specified
|
55
|
-
if self.config.tunnel.domain:
|
56
|
-
tunnel_config["domain"] = self.config.tunnel.domain
|
57
|
-
|
53
|
+
|
58
54
|
# Add basic auth if specified
|
59
|
-
if self.config.
|
60
|
-
tunnel_config["basic_auth"] = self.config.
|
61
|
-
|
55
|
+
if self.config.basic_auth:
|
56
|
+
tunnel_config["basic_auth"] = self.config.basic_auth
|
57
|
+
|
62
58
|
# Start tunnel
|
63
59
|
self.listener = ngrok.forward(**tunnel_config)
|
64
60
|
self.tunnel_url = self.listener.url()
|
65
|
-
|
61
|
+
|
66
62
|
logger.info(f"Ngrok tunnel started: {self.tunnel_url}")
|
67
63
|
return self.tunnel_url
|
68
|
-
|
64
|
+
|
69
65
|
except ImportError:
|
70
66
|
logger.warning("ngrok package not available. Requires Python 3.12+ or install with: pip install ngrok")
|
71
67
|
return None
|
@@ -158,16 +154,8 @@ class DjangoNgrok(BaseCfgModule):
|
|
158
154
|
return False
|
159
155
|
return self.manager.is_active()
|
160
156
|
|
161
|
-
def get_webhook_url(self, path:
|
157
|
+
def get_webhook_url(self, path: str = "/webhooks/") -> str:
|
162
158
|
"""Get webhook URL with ngrok tunnel or fallback to api_url."""
|
163
|
-
# Get path from config if not provided
|
164
|
-
if path is None:
|
165
|
-
config = self.get_config()
|
166
|
-
if config and hasattr(config, 'ngrok') and config.ngrok:
|
167
|
-
path = config.ngrok.webhook_path
|
168
|
-
else:
|
169
|
-
path = "/webhooks/"
|
170
|
-
|
171
159
|
# Try to get tunnel URL first
|
172
160
|
try:
|
173
161
|
tunnel_url = self.get_tunnel_url()
|
@@ -175,7 +163,7 @@ class DjangoNgrok(BaseCfgModule):
|
|
175
163
|
return f"{tunnel_url.rstrip('/')}/{path.lstrip('/')}"
|
176
164
|
except Exception as e:
|
177
165
|
logger.warning(f"Ngrok tunnel not available: {e}")
|
178
|
-
|
166
|
+
|
179
167
|
# Fallback to api_url from config
|
180
168
|
try:
|
181
169
|
config = self.get_config()
|
@@ -183,7 +171,7 @@ class DjangoNgrok(BaseCfgModule):
|
|
183
171
|
return f"{config.api_url.rstrip('/')}/{path.lstrip('/')}"
|
184
172
|
except Exception as e:
|
185
173
|
logger.warning(f"Failed to get config for webhook URL: {e}")
|
186
|
-
|
174
|
+
|
187
175
|
# Ultimate fallback
|
188
176
|
return f"http://localhost:8000/{path.lstrip('/')}"
|
189
177
|
|
@@ -229,22 +217,6 @@ class DjangoNgrok(BaseCfgModule):
|
|
229
217
|
def get_effective_tunnel_url(self) -> Optional[str]:
|
230
218
|
"""Get effective tunnel URL (alias for get_tunnel_url for clarity)."""
|
231
219
|
return self.get_tunnel_url()
|
232
|
-
|
233
|
-
def update_config_urls(self) -> None:
|
234
|
-
"""Update config URLs with tunnel URL if tunnel is active and update_api_url is enabled."""
|
235
|
-
config = self.get_config()
|
236
|
-
if not config or not hasattr(config, 'ngrok') or not config.ngrok:
|
237
|
-
return
|
238
|
-
|
239
|
-
# Only update if enabled in config
|
240
|
-
if not config.ngrok.update_api_url:
|
241
|
-
return
|
242
|
-
|
243
|
-
tunnel_url = self.get_tunnel_url()
|
244
|
-
if tunnel_url:
|
245
|
-
# Update api_url with tunnel URL
|
246
|
-
config.api_url = tunnel_url
|
247
|
-
logger.info(f"Updated api_url to tunnel URL: {tunnel_url}")
|
248
220
|
|
249
221
|
|
250
222
|
# Global instance for easy access
|
@@ -0,0 +1,344 @@
|
|
1
|
+
# Poetry Setup & Dependencies - Django RPC Module
|
2
|
+
|
3
|
+
**Status:** ✅ Ready to Use
|
4
|
+
**All Dependencies:** ✅ Already Installed
|
5
|
+
**Test Framework:** ✅ Working via Poetry
|
6
|
+
|
7
|
+
---
|
8
|
+
|
9
|
+
## Dependency Analysis
|
10
|
+
|
11
|
+
### ✅ Required Dependencies (Already Installed)
|
12
|
+
|
13
|
+
All dependencies for WebSocket RPC module are **already present** in `pyproject.toml`:
|
14
|
+
|
15
|
+
```toml
|
16
|
+
# Redis client (line 98-99)
|
17
|
+
"redis>=6.4.0,<7.0" # ✅ Redis Python client
|
18
|
+
"hiredis>=2.0.0,<4.0" # ✅ High-performance Redis protocol
|
19
|
+
|
20
|
+
# Pydantic models (line 57-58)
|
21
|
+
"pydantic>=2.11.0,<3.0" # ✅ Pydantic 2 core
|
22
|
+
"pydantic[email]>=2.11.0,<3.0" # ✅ Email validation extras
|
23
|
+
|
24
|
+
# Testing (dev group)
|
25
|
+
"pytest>=8.4,<9.0" # ✅ Test framework
|
26
|
+
"pytest-mock>=3.15,<4.0" # ✅ Mock support
|
27
|
+
```
|
28
|
+
|
29
|
+
### 📦 No Additional Dependencies Needed
|
30
|
+
|
31
|
+
**Important:** Do NOT add any new dependencies!
|
32
|
+
|
33
|
+
The WebSocket RPC module uses:
|
34
|
+
- ✅ Redis (already in core dependencies)
|
35
|
+
- ✅ Pydantic 2 (already in core dependencies)
|
36
|
+
- ✅ Standard library only (json, uuid, logging, threading)
|
37
|
+
|
38
|
+
---
|
39
|
+
|
40
|
+
## Running Tests via Poetry
|
41
|
+
|
42
|
+
### Basic Commands
|
43
|
+
|
44
|
+
```bash
|
45
|
+
# Navigate to django-cfg directory
|
46
|
+
cd libs/django_cfg
|
47
|
+
|
48
|
+
# Run all WebSocket RPC tests
|
49
|
+
poetry run pytest src/django_cfg/tests/websocket/ -v
|
50
|
+
|
51
|
+
# Run with concise output
|
52
|
+
poetry run pytest src/django_cfg/tests/websocket/ -q
|
53
|
+
|
54
|
+
# Run specific test file
|
55
|
+
poetry run pytest src/django_cfg/tests/websocket/test_models.py -v
|
56
|
+
|
57
|
+
# Run specific test class
|
58
|
+
poetry run pytest src/django_cfg/tests/websocket/test_client.py::TestRPCClientCall -v
|
59
|
+
```
|
60
|
+
|
61
|
+
### Using Test Markers
|
62
|
+
|
63
|
+
```bash
|
64
|
+
# Run only unit tests
|
65
|
+
poetry run pytest src/django_cfg/tests/websocket/ -m "unit"
|
66
|
+
|
67
|
+
# Run only model tests
|
68
|
+
poetry run pytest src/django_cfg/tests/websocket/ -m "unit and models"
|
69
|
+
|
70
|
+
# Run only client tests
|
71
|
+
poetry run pytest src/django_cfg/tests/websocket/ -m "unit and client"
|
72
|
+
```
|
73
|
+
|
74
|
+
### Test Collection (Dry Run)
|
75
|
+
|
76
|
+
```bash
|
77
|
+
# Show what tests would run
|
78
|
+
poetry run pytest src/django_cfg/tests/websocket/ --co -q
|
79
|
+
|
80
|
+
# Show with markers filter
|
81
|
+
poetry run pytest src/django_cfg/tests/websocket/ -m "models" --co -q
|
82
|
+
```
|
83
|
+
|
84
|
+
---
|
85
|
+
|
86
|
+
## Poetry vs Direct Python
|
87
|
+
|
88
|
+
### ❌ Don't Use PYTHONPATH Manually
|
89
|
+
|
90
|
+
```bash
|
91
|
+
# ❌ Old way (manual PYTHONPATH)
|
92
|
+
PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/
|
93
|
+
|
94
|
+
# ✅ Better way (poetry handles paths)
|
95
|
+
poetry run pytest src/django_cfg/tests/websocket/
|
96
|
+
```
|
97
|
+
|
98
|
+
### Why Poetry?
|
99
|
+
|
100
|
+
Poetry automatically:
|
101
|
+
- ✅ Sets correct PYTHONPATH
|
102
|
+
- ✅ Uses virtual environment (.venv)
|
103
|
+
- ✅ Manages dependencies
|
104
|
+
- ✅ Isolates from system Python
|
105
|
+
|
106
|
+
---
|
107
|
+
|
108
|
+
## Current Test Results
|
109
|
+
|
110
|
+
### Via Poetry
|
111
|
+
|
112
|
+
```bash
|
113
|
+
$ poetry run pytest src/django_cfg/tests/websocket/ -q
|
114
|
+
|
115
|
+
src/django_cfg/tests/websocket/test_client.py .................. [ 40%]
|
116
|
+
src/django_cfg/tests/websocket/test_models.py .......................... [100%]
|
117
|
+
|
118
|
+
======================== 44 passed in 0.20s ========================
|
119
|
+
```
|
120
|
+
|
121
|
+
### Test Breakdown
|
122
|
+
|
123
|
+
| Category | Count | Marker | Status |
|
124
|
+
|----------|-------|--------|--------|
|
125
|
+
| Model tests | 26 | `unit and models` | ✅ PASS |
|
126
|
+
| Client tests | 18 | `unit and client` | ✅ PASS |
|
127
|
+
| **Total** | **44** | `unit` | **✅ PASS** |
|
128
|
+
|
129
|
+
### Performance
|
130
|
+
|
131
|
+
- **Single test:** ~0.005s
|
132
|
+
- **Full suite:** ~0.20s
|
133
|
+
- **Meets target:** < 0.1s per test ✅
|
134
|
+
|
135
|
+
---
|
136
|
+
|
137
|
+
## Warnings Analysis
|
138
|
+
|
139
|
+
Current warnings (from libraries, not our code):
|
140
|
+
|
141
|
+
```
|
142
|
+
1. PydanticDeprecatedSince20: `min_items` → `min_length`
|
143
|
+
Source: Pydantic library internal
|
144
|
+
Action: Ignore (library will fix)
|
145
|
+
|
146
|
+
2. RemovedInDjango60Warning: URLField scheme change
|
147
|
+
Source: Django core
|
148
|
+
Action: Ignore (Django-specific)
|
149
|
+
|
150
|
+
3. DeprecationWarning: datetime.utcnow()
|
151
|
+
Source: Pydantic library internal
|
152
|
+
Action: Ignore (our code uses datetime.now(timezone.utc) ✅)
|
153
|
+
```
|
154
|
+
|
155
|
+
**Our code is clean** - all warnings come from dependencies, not from WebSocket RPC module.
|
156
|
+
|
157
|
+
---
|
158
|
+
|
159
|
+
## Development Workflow
|
160
|
+
|
161
|
+
### Install Development Dependencies
|
162
|
+
|
163
|
+
```bash
|
164
|
+
cd libs/django_cfg
|
165
|
+
|
166
|
+
# Install all dev dependencies
|
167
|
+
poetry install --with dev
|
168
|
+
|
169
|
+
# Or specific groups
|
170
|
+
poetry install --with dev,test,docs
|
171
|
+
```
|
172
|
+
|
173
|
+
### Add New Dependency (If Needed)
|
174
|
+
|
175
|
+
```bash
|
176
|
+
# Add to main dependencies
|
177
|
+
poetry add package-name
|
178
|
+
|
179
|
+
# Add to dev dependencies
|
180
|
+
poetry add --group dev package-name
|
181
|
+
|
182
|
+
# Add to test dependencies
|
183
|
+
poetry add --group test package-name
|
184
|
+
```
|
185
|
+
|
186
|
+
**For WebSocket RPC:** No new dependencies needed!
|
187
|
+
|
188
|
+
### Update Dependencies
|
189
|
+
|
190
|
+
```bash
|
191
|
+
# Update all dependencies
|
192
|
+
poetry update
|
193
|
+
|
194
|
+
# Update specific package
|
195
|
+
poetry update redis
|
196
|
+
|
197
|
+
# Show outdated packages
|
198
|
+
poetry show --outdated
|
199
|
+
```
|
200
|
+
|
201
|
+
---
|
202
|
+
|
203
|
+
## Project Structure
|
204
|
+
|
205
|
+
```
|
206
|
+
libs/django_cfg/
|
207
|
+
├── pyproject.toml # ✅ Poetry configuration
|
208
|
+
├── poetry.lock # ✅ Locked versions
|
209
|
+
├── .venv/ # ✅ Virtual environment
|
210
|
+
├── src/django_cfg/
|
211
|
+
│ ├── models/websocket/ # Pydantic models
|
212
|
+
│ ├── modules/django_rpc/ # RPC client
|
213
|
+
│ └── tests/websocket/ # Unit tests
|
214
|
+
└── tests/ # Integration tests
|
215
|
+
```
|
216
|
+
|
217
|
+
---
|
218
|
+
|
219
|
+
## pyproject.toml Key Sections
|
220
|
+
|
221
|
+
### Build System
|
222
|
+
|
223
|
+
```toml
|
224
|
+
[build-system]
|
225
|
+
requires = ["hatchling"]
|
226
|
+
build-backend = "hatchling.build"
|
227
|
+
```
|
228
|
+
|
229
|
+
Uses **hatchling** but supports Poetry for development.
|
230
|
+
|
231
|
+
### Core Dependencies
|
232
|
+
|
233
|
+
```toml
|
234
|
+
[project]
|
235
|
+
dependencies = [
|
236
|
+
"redis>=6.4.0,<7.0", # WebSocket RPC ✅
|
237
|
+
"pydantic>=2.11.0,<3.0", # WebSocket RPC ✅
|
238
|
+
# ... other dependencies
|
239
|
+
]
|
240
|
+
```
|
241
|
+
|
242
|
+
### Poetry Dev Group
|
243
|
+
|
244
|
+
```toml
|
245
|
+
[tool.poetry.group.dev.dependencies]
|
246
|
+
pytest = "^8.4.2"
|
247
|
+
pytest-django = "^4.11.1"
|
248
|
+
pytest-mock = "^3.14.1"
|
249
|
+
# ... other dev tools
|
250
|
+
```
|
251
|
+
|
252
|
+
---
|
253
|
+
|
254
|
+
## Common Issues
|
255
|
+
|
256
|
+
### Issue: `poetry: command not found`
|
257
|
+
|
258
|
+
**Solution:** Install Poetry
|
259
|
+
|
260
|
+
```bash
|
261
|
+
curl -sSL https://install.python-poetry.org | python3 -
|
262
|
+
```
|
263
|
+
|
264
|
+
### Issue: Virtual environment not found
|
265
|
+
|
266
|
+
**Solution:** Create virtual environment
|
267
|
+
|
268
|
+
```bash
|
269
|
+
cd libs/django_cfg
|
270
|
+
poetry install
|
271
|
+
```
|
272
|
+
|
273
|
+
### Issue: Tests can't import django_cfg
|
274
|
+
|
275
|
+
**Solution:** Always use `poetry run`
|
276
|
+
|
277
|
+
```bash
|
278
|
+
# ❌ Wrong
|
279
|
+
pytest src/django_cfg/tests/websocket/
|
280
|
+
|
281
|
+
# ✅ Correct
|
282
|
+
poetry run pytest src/django_cfg/tests/websocket/
|
283
|
+
```
|
284
|
+
|
285
|
+
### Issue: Module 'redis' not found
|
286
|
+
|
287
|
+
**Solution:** Install dependencies
|
288
|
+
|
289
|
+
```bash
|
290
|
+
poetry install --with dev,test
|
291
|
+
```
|
292
|
+
|
293
|
+
---
|
294
|
+
|
295
|
+
## CI/CD Integration
|
296
|
+
|
297
|
+
### GitHub Actions
|
298
|
+
|
299
|
+
```yaml
|
300
|
+
- name: Install dependencies
|
301
|
+
run: |
|
302
|
+
cd libs/django_cfg
|
303
|
+
poetry install --with dev,test
|
304
|
+
|
305
|
+
- name: Run WebSocket RPC tests
|
306
|
+
run: |
|
307
|
+
cd libs/django_cfg
|
308
|
+
poetry run pytest src/django_cfg/tests/websocket/ -v
|
309
|
+
```
|
310
|
+
|
311
|
+
### Pre-commit Hook
|
312
|
+
|
313
|
+
```yaml
|
314
|
+
# .pre-commit-config.yaml
|
315
|
+
- repo: local
|
316
|
+
hooks:
|
317
|
+
- id: pytest-websocket
|
318
|
+
name: WebSocket RPC Tests
|
319
|
+
entry: bash -c 'cd libs/django_cfg && poetry run pytest src/django_cfg/tests/websocket/ -q'
|
320
|
+
language: system
|
321
|
+
pass_filenames: false
|
322
|
+
```
|
323
|
+
|
324
|
+
---
|
325
|
+
|
326
|
+
## Summary
|
327
|
+
|
328
|
+
✅ **All dependencies installed**
|
329
|
+
✅ **Tests working via Poetry**
|
330
|
+
✅ **44/44 tests passing**
|
331
|
+
✅ **Performance excellent (~0.2s)**
|
332
|
+
✅ **No manual PYTHONPATH needed**
|
333
|
+
✅ **Ready for production**
|
334
|
+
|
335
|
+
**Next Steps:**
|
336
|
+
- Continue development using `poetry run`
|
337
|
+
- No new dependencies needed
|
338
|
+
- All tools ready to use
|
339
|
+
|
340
|
+
---
|
341
|
+
|
342
|
+
**Last Updated:** 2025-10-03
|
343
|
+
**Maintainer:** Django-CFG Team
|
344
|
+
**Status:** ✅ Production Ready
|