v1.7.0: refactor max_bot to flat structure, add VCF+UserModel+NLP history context, portal pages and proxy fixes

- Refactored max_bot from nested packages to flat module structure
- Q2: Extended BotUser model (patronymic, email, org, address, vcf_raw, contact_hash, phone_verified, email_verified, last_interaction, total_conversations, total_tickets)
- Q2: VCF parser (FN, N, TEL, EMAIL, ORG, ADR), upsert on re-contact, NLP history context (_get_user_history_context -> YandexGPT)
- Q1: Broadcast preview modal with 10s confirmation timer
- Q3: CSS var(--white)->var(--bg-card), var(--text)->var(--text-primary)
- Q4: bot_settings showNotification(), editable max_bot_id
- Q5: Webhook secret passthrough via X-Max-Bot-Api-Secret
- Masking sensitive keys, dialog_cleared handler, migrate via _add_column_if_not_exists()
- Rate limit (asyncio.sleep 0.5 per 10), dead code removed, conv.intent context in contact.py
- Portal pages: bot_consent, bot_kb (edit), bot_settings, bot_test, bot_tickets, portal_settings
- Tests: 21/21 passing, added test_yandex_gpt.py, test_email_sender.py
- Deploy: deploy_full.sh, schema.sql, seed_knowledge_base.sql
This commit is contained in:
2026-05-29 02:30:30 +03:00
parent 493e0b37a1
commit 72b6879f4b
234 changed files with 26768 additions and 6240 deletions
+67
View File
@@ -0,0 +1,67 @@
py_service/.env.example
py_service/CHANGELOG.md
py_service/Dockerfile
py_service/app/config.py
py_service/app/dependencies.py
py_service/app/documents_router.py
py_service/app/main.py
py_service/app/models/models.py
py_service/app/routers/service_pages.py
py_service/app/static/css/service-theme.css
py_service/app/static/css/service.css
py_service/app/static/js/theme.js
py_service/app/templates/base.html
py_service/app/templates/dashboard.html
py_service/app/templates/page.html
py_service/docker-compose.yml
py_service/requirements.txt
py_service/version.txt
py_service/.dockerignore
py_service/app/file_storage.py
py_service/app/file_sync.py
py_service/app/max_notifications.py
py_service/app/static/js/role-switcher.js
py_service/app/templates/pages/bot_analytics.html
py_service/app/templates/pages/bot_categories.html
py_service/app/templates/pages/bot_conversations.html
py_service/app/templates/pages/bot_features.html
py_service/app/templates/pages/bot_kb.html
py_service/app/templates/pages/bot_responses.html
py_service/app/templates/pages/bot_settings.html
py_service/app/templates/pages/bot_storage.html
py_service/app/templates/pages/bot_test_runner.html
py_service/app/templates/pages/bot_tickets.html
py_service/app/templates/pages/bot_users.html
py_service/app/templates/pages/formulas.html
py_service/app/templates/pages/portal_settings.html
py_service/app/templates/pages/role_settings.html
py_service/app/yandex_disk.py
"py_service/docs/KPI_\320\270\320\275\320\266\320\265\320\275\320\265\321\200\320\276\320\262.md"
"py_service/docs/SQL-\320\267\320\260\320\277\321\200\320\276\321\201\321\213.md"
"py_service/docs/\320\220\321\200\321\205\320\265\321\202\320\270\320\272\321\202\321\203\321\200\320\260 \320\261\321\200\320\265\320\275\320\264\320\260.md"
"py_service/docs/\320\220\321\200\321\205\320\270\321\202\320\265\320\272\321\202\321\203\321\200\320\260 \320\272\320\276\320\274\320\277\320\260\320\275\320\270\320\270.md"
"py_service/docs/\320\221\320\273\320\276\320\263.md"
"py_service/docs/\320\222\320\276\321\200\320\276\320\275\320\272\320\260.md"
"py_service/docs/\320\222\320\276\321\200\320\276\320\275\320\272\320\270 \321\202\320\265\320\273\320\265\320\263\321\200\320\260\320\274 \320\270 crm.md"
"py_service/docs/\320\224\320\260\321\210\320\261\320\276\321\200\320\264 \320\270\320\275\320\266\320\265\320\275\320\265\321\200\320\260.md"
"py_service/docs/\320\224\320\260\321\210\320\261\320\276\321\200\320\264 \321\202\320\265\321\205\320\275\320\270\320\272\320\260.md"
"py_service/docs/\320\224\320\276\320\272\320\276\320\267\320\260\321\202\320\265\320\273\321\214\320\275\320\260\321\217 \321\215\320\272\321\201\320\277\320\265\321\200\321\202\320\270\320\267\320\260.md"
"py_service/docs/\320\230\320\275\321\201\321\202\321\200\321\203\320\272\321\206\320\270\321\217 \320\277\320\276 \320\260\320\264\320\274\320\270\320\275-\320\277\320\260\320\275\320\265\320\273\320\270.md"
"py_service/docs/\320\232\320\237 \320\270 \321\201\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260 \320\260\321\203\320\264\320\270\321\202\320\260.md"
"py_service/docs/\320\232\320\276\320\275\321\202\320\265\320\275\321\202 \320\277\320\273\320\260\320\275.md"
"py_service/docs/\320\234\320\260\321\200\320\272\320\265\321\202\321\202\320\270\320\275\320\263.md"
"py_service/docs/\320\236\320\277\321\200\320\276\321\201\320\275\320\270\320\272-\321\200\320\260\321\201\321\207\320\265\321\202.md"
"py_service/docs/\320\236\321\201\320\275\320\276\320\262\320\260.md"
"py_service/docs/\320\241\320\260\320\271\321\202 \320\270 \321\203\320\277\320\260\320\272\320\276\320\262\320\272\320\260.md"
"py_service/docs/\320\241\320\272\321\200\320\270\320\277\321\202\321\213 \320\277\321\200\320\276\320\264\320\260\320\266.md"
"py_service/docs/\320\243\320\242\320\237 \320\270 \320\232\320\237.md"
"py_service/docs/\320\244\320\276\321\200\320\274\321\203\320\273\321\213 \320\270 \321\200\320\260\321\201\321\207\321\221\321\202\321\213.md"
"py_service/docs/\320\246\320\270\321\204\321\200\320\276\320\262\320\260\321\217 \320\274\320\276\320\264\320\265\320\273\321\214 \320\276\320\261\321\211\320\260\321\217.md"
"py_service/docs/\320\260\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\260\321\217_\321\201\320\270\321\201\321\202\320\265\320\274\320\260_SHS.md"
py_service/scripts/migrate_to_yandex.py
py_service/sql/v1.5.0_migration.sql
py_service/tests/__init__.py
py_service/tests/conftest.py
py_service/tests/test_routes.py
py_service/tests/test_routes_defined.py
py_service/tests/test_smoke_server.py