feat(ingest+поиск): приём ZIP через интерфейс, регистронезависимый поиск, чистка очереди
- Загрузка архива (§4.1): POST /ingest распаковывает ZIP, дораспознаёт и догружает прайсы в базу (append). Виджет в админке. Кэш эмбеддингов справочника (dict_emb.npy) — догрузка считает только новый файл, эмбеддинги best-effort с откатом на fuzzy при сбое Gemini. - Поиск по name_norm (lowercase): «УЗИ» и «узи» дают одинаковый результат — SQLite LIKE не сворачивает регистр для кириллицы. - Фильтр названий: код-мнемоники («МОЗО.15») больше не попадают в очередь. - /stats считается из базы — цифры на дашборде обновляются после загрузки. - Деплой через Dockerfile (зависимости в образе, код монтируется томом). - ruff: ядро и весь репозиторий проходят проверку. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
в числах, многотарифные колонки цен, строки-заголовки секций и шапку не в первой
|
||||
строке таблицы.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
@@ -85,7 +86,12 @@ def is_real_name(text) -> bool:
|
||||
"""
|
||||
s = clean(text)
|
||||
cyrillic = sum(1 for ch in s if "а" <= ch.lower() <= "я" or ch.lower() == "ё")
|
||||
return cyrillic >= 3 and not looks_like_code(s)
|
||||
if cyrillic < 3 or looks_like_code(s):
|
||||
return False
|
||||
# Код-мнемоника: цифры + только заглавные буквы + без пробела (напр. «МОЗО.15») — не услуга.
|
||||
if any(c.isdigit() for c in s) and " " not in s and not any(c.islower() for c in s):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def classify_price_tier(header_text) -> str | None:
|
||||
|
||||
Reference in New Issue
Block a user