From 784dd68a3b06fc971447758810b46a4eac922b24 Mon Sep 17 00:00:00 2001 From: codex Date: Thu, 8 Oct 2026 12:11:46 +0300 Subject: [PATCH 1/2] fix: simplify council XLSX columns --- README.md | 2 +- app/services/council_export.py | 17 +++++++++-------- app/version.py | 6 +++--- pyproject.toml | 2 +- tests/test_api.py | 2 +- tests/test_council.py | 10 +++++++++- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 514c8e1..83df5be 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ node --check app/static/admin.js Тесты с данными используют временную SQLite; отдельные API smoke-тесты запускают приложение с его текущей конфигурацией. Браузерная проверка: `pip install playwright`, `python -m playwright install chromium`, затем `python tests/browser_admin.py`. Она проверяет реальный рендеринг страниц, клавиатуру, диалог, фильтры и восстановление прогресса после ошибки. Скриншоты сохраняются во временную папку; путь выводится в конце. -Версия сервиса: `0.14.2`. Админка всегда показывает версии backend и frontend в footer. +Версия сервиса: `0.14.3`. Админка всегда показывает версии backend и frontend в footer. ## Разовый импорт публикаций diff --git a/app/services/council_export.py b/app/services/council_export.py index 8485ad2..0c1e307 100644 --- a/app/services/council_export.py +++ b/app/services/council_export.py @@ -22,15 +22,15 @@ def council_xlsx(result: dict) -> bytes: employees.title = "Сотрудники" publications = workbook.create_sheet("Публикации") parameters = workbook.create_sheet("Параметры") - _append(employees, ["№", "ФИО", "Учёная степень", "Q1", "Q2", "К1", "ВСЕГО", "В БД", "Все публикации", - "Статус", "Профиль ВШЭ", "Примечание"]) + _append(employees, ["№", "ФИО", "Учёная степень", "Q1", "Q2", "К1", "ВСЕГО", "Страница ВШЭ", "Все публикации", + "Профиль ВШЭ", "Примечание"]) _append(publications, ["№ сотрудника", "ФИО", "Название публикации", "Год", "Тип материала", "Источники", - "Критерии", "Q1", "Q2", "К1", "В ВСЕГО", "В БД", "DOI", "Ссылка на сайте", "Строки CSV"]) + "Критерии", "Q1", "Q2", "К1", "В ВСЕГО", "Страница ВШЭ", "DOI", "Ссылка на сайте", "Строки CSV"]) for number, candidate in enumerate(result["candidates"], 1): note = "Совпадение ФИО: публикации CSV не присвоены автоматически" if candidate["ambiguous"] else "" _append(employees, [number, candidate["name"], candidate["degree"], candidate["q1_count"], candidate["q2_count"], candidate["k1_count"], candidate["total_count"], - candidate["db_count"], candidate["count"], "Уволен" if candidate["dismissed"] else "Не отмечен как уволенный", + candidate["db_count"], candidate["count"], candidate["profile_url"], note]) for article in candidate["articles"]: _append(publications, [number, candidate["name"], article["title"], article["year"], article["type_label"], @@ -41,7 +41,7 @@ def council_xlsx(result: dict) -> bytes: for values in [ ["Начало периода", result["start"]], ["Конец периода", result["end"]], ["Поиск по ФИО", result["q"]], ["Сортировать по", {"full_name": "ФИО", "q1_count": "Q1", "q2_count": "Q2", "k1_count": "К1", - "total_count": "ВСЕГО", "db_count": "В БД", "count": "Все публикации"}[result["sort"]]], + "total_count": "ВСЕГО", "db_count": "Страница ВШЭ", "count": "Все публикации"}[result["sort"]]], ["Направление", "По возрастанию" if result["direction"] == "asc" else "По убыванию"], ["Сотрудников в выгрузке", result["matched"]], ["Всего сотрудников в списке", result["total"]], ["Отбор по степени", "Доктор наук в профиле; достаточно хотя бы одной публикации из CSV или БД"], @@ -51,11 +51,12 @@ def council_xlsx(result: dict) -> bytes: "в справочнике из ВАК категории.pdf; историческая категория не подтверждается. " "Без названия журнала К1 не подтверждён."], ["ВСЕГО", "Уникальные публикации, входящие в Q1 ИЛИ Q2 ИЛИ К1; пересечения учитываются один раз."], - ["В БД / Все публикации", "Все годы и категории; общий перечень объединяет CSV и БД без дублей."], + ["Страница ВШЭ / Все публикации", "Все годы и категории; общий перечень объединяет CSV и БД без дублей. " + "Страница ВШЭ учитывает сохранённые публикации, включая импортированные из CSV; источник указан на листе Публикации."], ]: _append(parameters, values) - for sheet, widths in [(employees, [7, 34, 40, 10, 10, 10, 12, 12, 22, 30, 45, 55]), - (publications, [16, 34, 65, 12, 40, 45, 65, 10, 10, 10, 12, 12, 45, 45, 22]), + for sheet, widths in [(employees, [7, 34, 40, 10, 10, 10, 12, 20, 22, 45, 55]), + (publications, [16, 34, 65, 12, 40, 45, 65, 10, 10, 10, 12, 20, 45, 45, 22]), (parameters, [32, 95])]: sheet.freeze_panes = "A2" sheet.auto_filter.ref = sheet.dimensions diff --git a/app/version.py b/app/version.py index 9adfae6..4011363 100644 --- a/app/version.py +++ b/app/version.py @@ -1,3 +1,3 @@ -APP_VERSION = "0.14.2" -FRONTEND_VERSION = "0.14.2" -BACKEND_VERSION = "0.14.2" +APP_VERSION = "0.14.3" +FRONTEND_VERSION = "0.14.3" +BACKEND_VERSION = "0.14.3" diff --git a/pyproject.toml b/pyproject.toml index 882d027..9b47761 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "miem-workers" -version = "0.14.2" +version = "0.14.3" description = "MIEM employees parser, admin API, and web admin" requires-python = ">=3.11" dependencies = [ diff --git a/tests/test_api.py b/tests/test_api.py index a891964..a2a2418 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -18,7 +18,7 @@ def test_health_returns_versions(): response = TestClient(app).get("/api/health") assert response.status_code == 200 - assert response.json()["backend_version"] == "0.14.2" + assert response.json()["backend_version"] == "0.14.3" def test_api_employees_and_stats_require_admin_session(): diff --git a/tests/test_council.py b/tests/test_council.py index c8791f1..a9d99f2 100644 --- a/tests/test_council.py +++ b/tests/test_council.py @@ -211,7 +211,7 @@ def test_public_page_data_minimization_and_safe_links(db_session, export): assert "<script>" in response.text and "