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
@@ -0,0 +1,16 @@
|
|
1
|
+
"""
|
2
|
+
Generators for ExternalData auto-generation.
|
3
|
+
|
4
|
+
Content, metadata, and field analysis utilities for automatic generation
|
5
|
+
of ExternalData from Django model instances.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from .content_generator import ExternalDataContentGenerator
|
9
|
+
from .metadata_generator import ExternalDataMetadataGenerator
|
10
|
+
from .field_analyzer import ExternalDataFieldAnalyzer
|
11
|
+
|
12
|
+
__all__ = [
|
13
|
+
'ExternalDataContentGenerator',
|
14
|
+
'ExternalDataMetadataGenerator',
|
15
|
+
'ExternalDataFieldAnalyzer',
|
16
|
+
]
|
@@ -0,0 +1,218 @@
|
|
1
|
+
"""
|
2
|
+
Content and title generation for ExternalData.
|
3
|
+
|
4
|
+
Handles automatic generation of titles and markdown content from model instances.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import List, Dict, Any, Tuple
|
8
|
+
|
9
|
+
|
10
|
+
class ExternalDataContentGenerator:
|
11
|
+
"""
|
12
|
+
Generate content and titles for model instances.
|
13
|
+
|
14
|
+
Provides smart auto-generation of titles and comprehensive markdown content
|
15
|
+
based on model fields and metadata.
|
16
|
+
"""
|
17
|
+
|
18
|
+
def __init__(self, instance):
|
19
|
+
"""
|
20
|
+
Initialize content generator for a model instance.
|
21
|
+
|
22
|
+
Args:
|
23
|
+
instance: Django model instance to generate content for
|
24
|
+
"""
|
25
|
+
self.instance = instance
|
26
|
+
self.model_class = instance.__class__
|
27
|
+
|
28
|
+
def generate_title(self) -> str:
|
29
|
+
"""
|
30
|
+
Auto-generate title based on model fields.
|
31
|
+
|
32
|
+
Tries common title fields first (title, name, etc.), then falls back
|
33
|
+
to string representation with model name.
|
34
|
+
|
35
|
+
Returns:
|
36
|
+
Generated title string (e.g., "Product: iPhone 15")
|
37
|
+
"""
|
38
|
+
# Try common title fields first
|
39
|
+
title_fields = ['title', 'name', 'full_name', 'display_name', 'label']
|
40
|
+
|
41
|
+
for field_name in title_fields:
|
42
|
+
if hasattr(self.instance, field_name):
|
43
|
+
value = getattr(self.instance, field_name, None)
|
44
|
+
if value and str(value).strip():
|
45
|
+
# Add model context for clarity
|
46
|
+
model_name = self.model_class._meta.verbose_name or self.model_class.__name__
|
47
|
+
return f"{model_name}: {value}"
|
48
|
+
|
49
|
+
# Fallback: use string representation with model name
|
50
|
+
model_name = self.model_class._meta.verbose_name or self.model_class.__name__
|
51
|
+
return f"{model_name}: {self.instance}"
|
52
|
+
|
53
|
+
def generate_content(self) -> str:
|
54
|
+
"""
|
55
|
+
Auto-generate comprehensive markdown content.
|
56
|
+
|
57
|
+
Generates structured markdown content with:
|
58
|
+
- Header with title
|
59
|
+
- Basic Information section with key fields
|
60
|
+
- Related Information section with relationships
|
61
|
+
- Statistics section if available
|
62
|
+
- Technical Information section with metadata
|
63
|
+
|
64
|
+
Returns:
|
65
|
+
Generated markdown content as string
|
66
|
+
"""
|
67
|
+
content_parts = []
|
68
|
+
|
69
|
+
# Header with title
|
70
|
+
title = self.generate_title()
|
71
|
+
content_parts.append(f"# {title}")
|
72
|
+
content_parts.append("")
|
73
|
+
|
74
|
+
# Basic Information section
|
75
|
+
content_parts.append("## Basic Information")
|
76
|
+
|
77
|
+
# Add key fields
|
78
|
+
key_fields = self._get_content_fields()
|
79
|
+
for field_name, field_value, field_label in key_fields:
|
80
|
+
if field_value is not None and str(field_value).strip():
|
81
|
+
content_parts.append(f"- **{field_label}**: {field_value}")
|
82
|
+
|
83
|
+
content_parts.append("")
|
84
|
+
|
85
|
+
# Add relationships section if any
|
86
|
+
relationships = self._get_relationship_info()
|
87
|
+
if relationships:
|
88
|
+
content_parts.append("## Related Information")
|
89
|
+
for rel_name, rel_info in relationships.items():
|
90
|
+
content_parts.append(f"- **{rel_name}**: {rel_info}")
|
91
|
+
content_parts.append("")
|
92
|
+
|
93
|
+
# Add statistics if available
|
94
|
+
stats = self._get_statistics_info()
|
95
|
+
if stats:
|
96
|
+
content_parts.append("## Statistics")
|
97
|
+
for stat_name, stat_value in stats.items():
|
98
|
+
content_parts.append(f"- **{stat_name}**: {stat_value}")
|
99
|
+
content_parts.append("")
|
100
|
+
|
101
|
+
# Add metadata section
|
102
|
+
content_parts.append("## Technical Information")
|
103
|
+
content_parts.append(
|
104
|
+
f"This data is automatically synchronized from the {self.model_class.__name__} "
|
105
|
+
f"model using ExternalDataMixin."
|
106
|
+
)
|
107
|
+
content_parts.append(f"")
|
108
|
+
content_parts.append(f"**Model**: {self.model_class._meta.label}")
|
109
|
+
content_parts.append(f"**ID**: {self.instance.pk}")
|
110
|
+
|
111
|
+
if hasattr(self.instance, 'created_at') and self.instance.created_at:
|
112
|
+
created_str = self.instance.created_at.strftime('%Y-%m-%d %H:%M:%S')
|
113
|
+
content_parts.append(f"**Created**: {created_str}")
|
114
|
+
|
115
|
+
if hasattr(self.instance, 'updated_at') and self.instance.updated_at:
|
116
|
+
updated_str = self.instance.updated_at.strftime('%Y-%m-%d %H:%M:%S')
|
117
|
+
content_parts.append(f"**Updated**: {updated_str}")
|
118
|
+
|
119
|
+
return "\n".join(content_parts)
|
120
|
+
|
121
|
+
def _get_content_fields(self) -> List[Tuple[str, Any, str]]:
|
122
|
+
"""
|
123
|
+
Get fields to include in content generation.
|
124
|
+
|
125
|
+
Returns priority fields with their values and labels.
|
126
|
+
|
127
|
+
Returns:
|
128
|
+
List of tuples: (field_name, field_value, field_label)
|
129
|
+
"""
|
130
|
+
fields_info = []
|
131
|
+
|
132
|
+
# Define field priority and labels
|
133
|
+
priority_fields = {
|
134
|
+
'name': 'Name',
|
135
|
+
'title': 'Title',
|
136
|
+
'code': 'Code',
|
137
|
+
'description': 'Description',
|
138
|
+
'summary': 'Summary',
|
139
|
+
'body_type': 'Body Type',
|
140
|
+
'segment': 'Segment',
|
141
|
+
'category': 'Category',
|
142
|
+
'type': 'Type',
|
143
|
+
'status': 'Status',
|
144
|
+
'is_active': 'Active',
|
145
|
+
'is_public': 'Public',
|
146
|
+
'price': 'Price',
|
147
|
+
'year': 'Year',
|
148
|
+
'fuel_type': 'Fuel Type',
|
149
|
+
}
|
150
|
+
|
151
|
+
# Add priority fields first
|
152
|
+
for field_name, field_label in priority_fields.items():
|
153
|
+
if hasattr(self.instance, field_name):
|
154
|
+
value = getattr(self.instance, field_name, None)
|
155
|
+
if value is not None:
|
156
|
+
# Format boolean fields
|
157
|
+
if isinstance(value, bool):
|
158
|
+
value = "Yes" if value else "No"
|
159
|
+
# Format choice fields
|
160
|
+
elif hasattr(self.instance, f'get_{field_name}_display'):
|
161
|
+
display_value = getattr(self.instance, f'get_{field_name}_display')()
|
162
|
+
if display_value:
|
163
|
+
value = display_value
|
164
|
+
# Format foreign key relationships
|
165
|
+
elif hasattr(value, '__str__'):
|
166
|
+
value = str(value)
|
167
|
+
|
168
|
+
fields_info.append((field_name, value, field_label))
|
169
|
+
|
170
|
+
return fields_info
|
171
|
+
|
172
|
+
def _get_relationship_info(self) -> Dict[str, str]:
|
173
|
+
"""
|
174
|
+
Get relationship information for content.
|
175
|
+
|
176
|
+
Extracts foreign key relationships from common field names.
|
177
|
+
|
178
|
+
Returns:
|
179
|
+
Dictionary mapping relationship names to string values
|
180
|
+
"""
|
181
|
+
relationships = {}
|
182
|
+
|
183
|
+
# Common relationship field names
|
184
|
+
rel_fields = ['brand', 'category', 'parent', 'owner', 'user', 'created_by']
|
185
|
+
|
186
|
+
for field_name in rel_fields:
|
187
|
+
if hasattr(self.instance, field_name):
|
188
|
+
value = getattr(self.instance, field_name, None)
|
189
|
+
if value:
|
190
|
+
relationships[field_name.replace('_', ' ').title()] = str(value)
|
191
|
+
|
192
|
+
return relationships
|
193
|
+
|
194
|
+
def _get_statistics_info(self) -> Dict[str, Any]:
|
195
|
+
"""
|
196
|
+
Get statistics information for content.
|
197
|
+
|
198
|
+
Extracts numeric statistics from common field names.
|
199
|
+
|
200
|
+
Returns:
|
201
|
+
Dictionary mapping statistic names to formatted values
|
202
|
+
"""
|
203
|
+
stats = {}
|
204
|
+
|
205
|
+
# Common statistics field names
|
206
|
+
stat_fields = ['total_vehicles', 'total_models', 'total_items', 'count', 'views', 'likes']
|
207
|
+
|
208
|
+
for field_name in stat_fields:
|
209
|
+
if hasattr(self.instance, field_name):
|
210
|
+
value = getattr(self.instance, field_name, None)
|
211
|
+
if value is not None and (isinstance(value, (int, float)) and value > 0):
|
212
|
+
label = field_name.replace('_', ' ').title()
|
213
|
+
if isinstance(value, float):
|
214
|
+
stats[label] = f"{value:,.2f}"
|
215
|
+
else:
|
216
|
+
stats[label] = f"{value:,}"
|
217
|
+
|
218
|
+
return stats
|
@@ -0,0 +1,76 @@
|
|
1
|
+
"""
|
2
|
+
Field analysis and detection for ExternalData.
|
3
|
+
|
4
|
+
Handles automatic detection of important fields to watch and analyze.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import List
|
8
|
+
|
9
|
+
|
10
|
+
class ExternalDataFieldAnalyzer:
|
11
|
+
"""
|
12
|
+
Analyze model fields for auto-generation and change detection.
|
13
|
+
|
14
|
+
Provides utilities to detect important fields that should be watched
|
15
|
+
for changes and included in content generation.
|
16
|
+
"""
|
17
|
+
|
18
|
+
def __init__(self, model_class):
|
19
|
+
"""
|
20
|
+
Initialize field analyzer for a model class.
|
21
|
+
|
22
|
+
Args:
|
23
|
+
model_class: Django model class to analyze
|
24
|
+
"""
|
25
|
+
self.model_class = model_class
|
26
|
+
|
27
|
+
def auto_detect_watch_fields(self) -> List[str]:
|
28
|
+
"""
|
29
|
+
Auto-detect important fields to watch for changes.
|
30
|
+
|
31
|
+
Analyzes model fields and returns list of field names that should
|
32
|
+
trigger ExternalData updates when changed.
|
33
|
+
|
34
|
+
Returns:
|
35
|
+
List of field names to watch (max 10 fields)
|
36
|
+
"""
|
37
|
+
watch_fields = []
|
38
|
+
|
39
|
+
# Get all model fields
|
40
|
+
for field in self.model_class._meta.get_fields():
|
41
|
+
if hasattr(field, 'name') and not field.name.startswith('_'):
|
42
|
+
field_name = field.name
|
43
|
+
|
44
|
+
# Skip auto-generated and system fields
|
45
|
+
skip_fields = {
|
46
|
+
'id', 'pk', 'created_at', 'updated_at', 'external_source_id',
|
47
|
+
'_external_content_hash', 'slug'
|
48
|
+
}
|
49
|
+
if field_name in skip_fields:
|
50
|
+
continue
|
51
|
+
|
52
|
+
# Skip reverse foreign keys and many-to-many
|
53
|
+
if hasattr(field, 'related_model') and field.many_to_many:
|
54
|
+
continue
|
55
|
+
if hasattr(field, 'remote_field') and field.remote_field:
|
56
|
+
if hasattr(field.remote_field, 'related_name'):
|
57
|
+
continue
|
58
|
+
|
59
|
+
# Include important field types
|
60
|
+
if hasattr(field, '__class__'):
|
61
|
+
field_type = field.__class__.__name__
|
62
|
+
important_types = {
|
63
|
+
'CharField', 'TextField', 'BooleanField', 'IntegerField',
|
64
|
+
'PositiveIntegerField', 'ForeignKey', 'DecimalField', 'FloatField'
|
65
|
+
}
|
66
|
+
if field_type in important_types:
|
67
|
+
watch_fields.append(field_name)
|
68
|
+
|
69
|
+
# If no fields detected, watch all non-system fields
|
70
|
+
if not watch_fields:
|
71
|
+
for field in self.model_class._meta.get_fields():
|
72
|
+
if hasattr(field, 'name') and not field.name.startswith('_'):
|
73
|
+
if field.name not in {'id', 'pk'}:
|
74
|
+
watch_fields.append(field.name)
|
75
|
+
|
76
|
+
return watch_fields[:10] # Limit to prevent too many triggers
|
@@ -0,0 +1,124 @@
|
|
1
|
+
"""
|
2
|
+
Metadata and tags generation for ExternalData.
|
3
|
+
|
4
|
+
Handles automatic generation of descriptions, tags, and metadata from model instances.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import List
|
8
|
+
|
9
|
+
|
10
|
+
class ExternalDataMetadataGenerator:
|
11
|
+
"""
|
12
|
+
Generate metadata, tags, and descriptions for model instances.
|
13
|
+
|
14
|
+
Provides smart auto-generation based on model fields and relationships.
|
15
|
+
"""
|
16
|
+
|
17
|
+
def __init__(self, instance):
|
18
|
+
"""
|
19
|
+
Initialize metadata generator for a model instance.
|
20
|
+
|
21
|
+
Args:
|
22
|
+
instance: Django model instance to generate metadata for
|
23
|
+
"""
|
24
|
+
self.instance = instance
|
25
|
+
self.model_class = instance.__class__
|
26
|
+
|
27
|
+
def generate_description(self) -> str:
|
28
|
+
"""
|
29
|
+
Auto-generate description based on model fields.
|
30
|
+
|
31
|
+
Tries common description fields first, then builds description
|
32
|
+
from key fields (name, status, dates).
|
33
|
+
|
34
|
+
Returns:
|
35
|
+
Generated description string
|
36
|
+
"""
|
37
|
+
model_name = self.model_class._meta.verbose_name or self.model_class.__name__
|
38
|
+
|
39
|
+
# Try common description fields
|
40
|
+
desc_fields = ['description', 'summary', 'about', 'details', 'info']
|
41
|
+
for field_name in desc_fields:
|
42
|
+
if hasattr(self.instance, field_name):
|
43
|
+
value = getattr(self.instance, field_name, None)
|
44
|
+
if value and str(value).strip():
|
45
|
+
return f"{model_name} information: {value}"
|
46
|
+
|
47
|
+
# Build description from key fields
|
48
|
+
key_info = []
|
49
|
+
|
50
|
+
# Add primary identifier
|
51
|
+
if hasattr(self.instance, 'name') and self.instance.name:
|
52
|
+
key_info.append(f"Name: {self.instance.name}")
|
53
|
+
elif hasattr(self.instance, 'title') and self.instance.title:
|
54
|
+
key_info.append(f"Title: {self.instance.title}")
|
55
|
+
|
56
|
+
# Add status if available
|
57
|
+
if hasattr(self.instance, 'is_active'):
|
58
|
+
status = "Active" if self.instance.is_active else "Inactive"
|
59
|
+
key_info.append(f"Status: {status}")
|
60
|
+
|
61
|
+
# Add creation date if available
|
62
|
+
if hasattr(self.instance, 'created_at') and self.instance.created_at:
|
63
|
+
created_str = self.instance.created_at.strftime('%Y-%m-%d')
|
64
|
+
key_info.append(f"Created: {created_str}")
|
65
|
+
|
66
|
+
if key_info:
|
67
|
+
return (f"Comprehensive information about this {model_name.lower()}. "
|
68
|
+
f"{', '.join(key_info)}.")
|
69
|
+
|
70
|
+
return f"Auto-generated information from {model_name} model."
|
71
|
+
|
72
|
+
def generate_tags(self) -> List[str]:
|
73
|
+
"""
|
74
|
+
Auto-generate tags based on model fields and metadata.
|
75
|
+
|
76
|
+
Generates tags from:
|
77
|
+
- Model name and verbose name
|
78
|
+
- App label
|
79
|
+
- Field values (category, type, status, etc.)
|
80
|
+
- Boolean field values
|
81
|
+
|
82
|
+
Returns:
|
83
|
+
List of tags (max 10), cleaned and deduplicated
|
84
|
+
"""
|
85
|
+
tags = []
|
86
|
+
|
87
|
+
# Add model-based tags
|
88
|
+
tags.append(self.model_class.__name__.lower())
|
89
|
+
if self.model_class._meta.verbose_name:
|
90
|
+
tags.append(self.model_class._meta.verbose_name.lower().replace(' ', '_'))
|
91
|
+
|
92
|
+
# Add app label
|
93
|
+
tags.append(self.model_class._meta.app_label)
|
94
|
+
|
95
|
+
# Add field-based tags
|
96
|
+
tag_fields = ['category', 'type', 'kind', 'status', 'brand', 'model']
|
97
|
+
for field_name in tag_fields:
|
98
|
+
if hasattr(self.instance, field_name):
|
99
|
+
value = getattr(self.instance, field_name, None)
|
100
|
+
if value:
|
101
|
+
# Handle foreign key relationships
|
102
|
+
if hasattr(value, 'name'):
|
103
|
+
tags.append(str(value.name).lower())
|
104
|
+
elif hasattr(value, 'code'):
|
105
|
+
tags.append(str(value.code).lower())
|
106
|
+
else:
|
107
|
+
tags.append(str(value).lower())
|
108
|
+
|
109
|
+
# Add boolean field tags
|
110
|
+
bool_fields = ['is_active', 'is_public', 'is_featured', 'is_published']
|
111
|
+
for field_name in bool_fields:
|
112
|
+
if hasattr(self.instance, field_name):
|
113
|
+
value = getattr(self.instance, field_name, None)
|
114
|
+
if value is True:
|
115
|
+
tags.append(field_name.replace('is_', ''))
|
116
|
+
|
117
|
+
# Clean and deduplicate tags
|
118
|
+
clean_tags = []
|
119
|
+
for tag in tags:
|
120
|
+
clean_tag = str(tag).lower().strip().replace(' ', '_')
|
121
|
+
if clean_tag and clean_tag not in clean_tags:
|
122
|
+
clean_tags.append(clean_tag)
|
123
|
+
|
124
|
+
return clean_tags[:10] # Limit to 10 tags
|
@@ -18,7 +18,7 @@ from ..models.external_data import ExternalData, ExternalDataChunk, ExternalData
|
|
18
18
|
from ..services.base import BaseService
|
19
19
|
from ..services.embedding import process_external_data_chunks_optimized
|
20
20
|
from .creator import ExternalDataCreator
|
21
|
-
from .config import
|
21
|
+
from .config import ExternalDataMetaConfig
|
22
22
|
|
23
23
|
logger = logging.getLogger(__name__)
|
24
24
|
|
@@ -62,7 +62,7 @@ class ExternalDataService(BaseService):
|
|
62
62
|
"""
|
63
63
|
try:
|
64
64
|
# Create configuration
|
65
|
-
config =
|
65
|
+
config = ExternalDataMetaConfig(
|
66
66
|
title=title,
|
67
67
|
description=description,
|
68
68
|
source_type=source_type,
|
@@ -0,0 +1,17 @@
|
|
1
|
+
"""
|
2
|
+
Code analysis utilities.
|
3
|
+
|
4
|
+
Complexity calculation, quality assessment, purpose detection, and tag generation.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from .complexity_analyzer import ComplexityAnalyzer
|
8
|
+
from .quality_analyzer import QualityAnalyzer
|
9
|
+
from .purpose_detector import PurposeDetector
|
10
|
+
from .tag_generator import TagGenerator
|
11
|
+
|
12
|
+
__all__ = [
|
13
|
+
'ComplexityAnalyzer',
|
14
|
+
'QualityAnalyzer',
|
15
|
+
'PurposeDetector',
|
16
|
+
'TagGenerator',
|
17
|
+
]
|
@@ -0,0 +1,33 @@
|
|
1
|
+
"""
|
2
|
+
Code complexity analyzer.
|
3
|
+
|
4
|
+
Calculates complexity score for code chunks.
|
5
|
+
"""
|
6
|
+
|
7
|
+
|
8
|
+
class ComplexityAnalyzer:
|
9
|
+
"""Analyze code complexity."""
|
10
|
+
|
11
|
+
@staticmethod
|
12
|
+
def calculate_code_complexity(content: str) -> float:
|
13
|
+
"""
|
14
|
+
Calculate code complexity score.
|
15
|
+
|
16
|
+
Simple complexity metric based on lines and control structures.
|
17
|
+
|
18
|
+
Args:
|
19
|
+
content: Code content to analyze
|
20
|
+
|
21
|
+
Returns:
|
22
|
+
Complexity score between 0.0 and 1.0
|
23
|
+
"""
|
24
|
+
# Simple complexity based on lines and control structures
|
25
|
+
lines = content.split('\n')
|
26
|
+
complexity = len(lines) / 100.0 # Base complexity
|
27
|
+
|
28
|
+
# Add complexity for control structures
|
29
|
+
control_keywords = ['if', 'for', 'while', 'try', 'except', 'with']
|
30
|
+
for keyword in control_keywords:
|
31
|
+
complexity += content.count(keyword) * 0.1
|
32
|
+
|
33
|
+
return min(1.0, complexity)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
"""
|
2
|
+
Code purpose detector.
|
3
|
+
|
4
|
+
Detects the purpose of code elements based on naming and content.
|
5
|
+
"""
|
6
|
+
|
7
|
+
|
8
|
+
class PurposeDetector:
|
9
|
+
"""Detect purpose of code elements."""
|
10
|
+
|
11
|
+
@staticmethod
|
12
|
+
def detect_code_purpose(element_name: str, content: str) -> str:
|
13
|
+
"""
|
14
|
+
Detect purpose of code element.
|
15
|
+
|
16
|
+
Args:
|
17
|
+
element_name: Name of the code element
|
18
|
+
content: Element content
|
19
|
+
|
20
|
+
Returns:
|
21
|
+
Purpose string (e.g., 'test', 'initialization', 'configuration')
|
22
|
+
"""
|
23
|
+
name_lower = element_name.lower()
|
24
|
+
|
25
|
+
if name_lower.startswith('test_'):
|
26
|
+
return 'test'
|
27
|
+
elif name_lower.startswith('_'):
|
28
|
+
return 'private_method'
|
29
|
+
elif 'config' in name_lower:
|
30
|
+
return 'configuration'
|
31
|
+
elif 'init' in name_lower:
|
32
|
+
return 'initialization'
|
33
|
+
elif 'main' in name_lower:
|
34
|
+
return 'main_function'
|
35
|
+
else:
|
36
|
+
return 'implementation'
|
@@ -0,0 +1,39 @@
|
|
1
|
+
"""
|
2
|
+
Code quality analyzer.
|
3
|
+
|
4
|
+
Assesses code quality based on documentation and formatting.
|
5
|
+
"""
|
6
|
+
|
7
|
+
|
8
|
+
class QualityAnalyzer:
|
9
|
+
"""Assess code quality."""
|
10
|
+
|
11
|
+
@staticmethod
|
12
|
+
def assess_code_quality(content: str) -> float:
|
13
|
+
"""
|
14
|
+
Assess code quality score.
|
15
|
+
|
16
|
+
Simple quality assessment based on documentation and formatting.
|
17
|
+
|
18
|
+
Args:
|
19
|
+
content: Code content to analyze
|
20
|
+
|
21
|
+
Returns:
|
22
|
+
Quality score between 0.0 and 1.0
|
23
|
+
"""
|
24
|
+
# Simple quality assessment
|
25
|
+
quality = 0.5 # Base quality
|
26
|
+
|
27
|
+
# Boost for docstrings
|
28
|
+
if '"""' in content or "'''" in content:
|
29
|
+
quality += 0.2
|
30
|
+
|
31
|
+
# Boost for comments
|
32
|
+
comment_lines = len([line for line in content.split('\n') if line.strip().startswith('#')])
|
33
|
+
quality += min(0.2, comment_lines / 10.0)
|
34
|
+
|
35
|
+
# Penalty for very long lines
|
36
|
+
long_lines = len([line for line in content.split('\n') if len(line) > 100])
|
37
|
+
quality -= min(0.2, long_lines / 10.0)
|
38
|
+
|
39
|
+
return max(0.0, min(1.0, quality))
|