fix: clarify council publication counters and sources
CI / test (pull_request) Successful in 9m26s
CI / Fingerprint diagnostics (production deployment temporarily disabled) (pull_request) Has been skipped

This commit is contained in:
codex committed 2026-10-08 19:06:14 +03:00
1 parent ec9a03fcf2
commit 2e48292a32
7 files changed
+20 -15

No files matched your search

+4
View File
@@ -1,5 +1,9 @@
# Changelog
## 0.16.3
- Уточнены описание страницы совета и пояснения к источникам данных, предварительным счётчикам, подтверждённым работам и подбору по специальности.
## 0.16.2
- Страница совета и XLSX настроены на технические науки и пятилетний период относительно текущей даты. Убраны дата ходатайства, сведения о монографиях и связанные причины проверки.
+1 -1
View File
@@ -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.16.2`. Админка всегда показывает версии backend и frontend в footer.
Версия сервиса: `0.16.3`. Админка всегда показывает версии backend и frontend в footer.
## Разовый импорт публикаций
+8 -7
View File
@@ -5,7 +5,7 @@
<header class="council__hero">
<div class="council__hero-copy">
<h2 class="council__title" id="council-title">Диссертационный совет</h2>
<p class="council__intro">Проверка публикационных критериев пунктов 5–6 по техническим наукам для докторов, кандидатов наук и PhD. Показаны обнаруженные степени, предварительные сведения и отдельно подтверждённые работы. Соответствие этим критериям не означает автоматического включения в совет.</p>
<p class="council__intro">Подбор сотрудников в диссертационный совет по техническим наукам. Публикации за последние пять лет сопоставляются с данными о квартилях и категориях журналов. Минимум — 9 работ для доктора наук и 20 для кандидата наук или PhD. Предварительный подсчёт и подтверждённые работы показаны отдельно.</p>
</div>
</header>
@@ -19,12 +19,13 @@
{% else %}
{% if catalog_issues %}<div class="council__message" role="alert"><p>{{ catalog_issues|join('; ') }}. Повреждённые сведения не используются для зачёта.</p></div>{% endif %}
<details class="council__notice">
<summary><strong>Как читать счётчики и критерии</strong></summary>
<p>Предварительные Q1/Q2 включают отметки CSV, применимые снимки каталогов и отдельные подтверждения. Предварительные К1/К2 включают совпадения журнала со справочником ВАК. ВСЕГО — объединение Q1/Q2/К1/RSCI и К2 для доктора наук. Работа учитывается один раз. Подтверждённое число требует самостоятельных доказательств применимости основания к этой работе.</p>
<p>Период {{ start.strftime('%d.%m.%Y') }} — {{ end.strftime('%d.%m.%Y') }} относительно текущей даты. Подтверждённый итог требует документального подтверждения высшей степени и работ с проверенными типом, периодом и допустимым основанием. Пограничные даты и годы, неизвестные типы и исторические категории требуют проверки. Предварительные числа сами по себе не подтверждают соответствие порогу. К2 допустим самостоятельно только для доктора наук; РИНЦ не заменяет RSCI.</p>
<p>Q1/Q2-каталоги — ограниченные тематические подборки со снимком метрик 2025 года. Они не подтверждают другие годы и текущую индексацию. Данные основаны на открытых копиях таблиц Scopus/JCR. Аналитическая связь журнала со специальностью не подтверждает содержание конкретной статьи. Порог и тематическое рассмотрение показываются отдельно.</p>
<p>«В БД» и «Все публикации» показывают количество работ за все годы, независимо от категорий. Общий перечень объединяет CSV и БД без дублей. Наличие публикаций не подтверждает соответствие всем требованиям совета.</p>
<p>При выборе специальности показаны сотрудники с хотя бы одной учитываемой за пять лет публикацией в журнале К1, которому эта специальность присвоена в «ВАК Перечень.pdf» на 15.09.2026. Это соответствие по журналу; содержание статьи и исторический перечень специальностей на дату публикации не проверяются.</p>
<summary><strong>Как рассчитываются показатели</strong></summary>
<p>Период оценки: {{ start.strftime('%d.%m.%Y') }} — {{ end.strftime('%d.%m.%Y') }}, последние пять лет относительно текущей даты Москвы. Для доктора наук применяется минимум 9 публикаций по пункту 5, для кандидата наук или PhD — 20 по пункту 6. Используется высшая обнаруженная степень; её документальное подтверждение проверяется отдельно.</p>
<p>Q1, Q2, К1, К2 и RSCI — предварительные показатели. Квартили определяются по отметкам CSV, применимым данным каталогов и проверенным основаниям; категории К1/К2 — по сопоставлению журнала со справочниками ВАК. RSCI учитывается при наличии отдельной записи об этом основании; отметка РИНЦ сама по себе его не подтверждает. Сведения из профиля сотрудника дополняются внешними источниками.</p>
<p>ВСЕГО — число уникальных работ с основаниями Q1/Q2/К1/RSCI; для доктора наук учитывается также К2. Пересечения между основаниями не увеличивают итог. Для кандидата наук или PhD одной категории К2 недостаточно. Известные другие виды материалов не входят в этот подсчёт без отдельного подтверждения их допустимости.</p>
<p>«Подтверждено» — работы с проверенными видом материала, периодом и допустимым основанием. Для пограничных лет нужно уточнить дату публикации; текущая категория журнала не подтверждает его категорию в год выхода работы. «Требует проверки» означает, что для вывода не хватает подтверждений: например, степени, даты или основания зачёта работы. Это не означает, что у сотрудника нет нужных публикаций. Соответствие публикационному минимуму не означает автоматического включения в совет.</p>
<p>Фильтр «Специальность ВАК» подбирает сотрудников с хотя бы одной публикацией за пять лет в подходящем журнале К1. Связь определяется по журналу из Перечня ВАК на 15.09.2026, а не по содержанию статьи. Квартильные каталоги содержат ограниченные подборки и метрики 2025 года; они не подтверждают другие годы или текущую индексацию. Аналитическая связь журнала со специальностью и отдельное рассмотрение статьи показаны в публикациях.</p>
<p>«В БД» — количество сохранённых публикаций сотрудника за все годы. «Все публикации» — общий перечень из БД и CSV без дублей, также за все годы и независимо от категории. При совпадении ФИО нескольких сотрудников записи CSV не присваиваются автоматически. XLSX содержит всех найденных сотрудников и их публикации, включая другие страницы списка.</p>
</details>
<form class="council__search" method="get" action="/admin/council" role="search">
+3 -3
View File
@@ -1,3 +1,3 @@
APP_VERSION = "0.16.2"
FRONTEND_VERSION = "0.16.2"
BACKEND_VERSION = "0.16.2"
APP_VERSION = "0.16.3"
FRONTEND_VERSION = "0.16.3"
BACKEND_VERSION = "0.16.3"
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "miem-workers"
version = "0.16.2"
version = "0.16.3"
description = "MIEM employees parser, admin API, and web admin"
requires-python = ">=3.11"
dependencies = [
+1 -1
View File
@@ -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.16.2"
assert response.json()["backend_version"] == "0.16.3"
def test_api_employees_and_stats_require_admin_session():
+2 -2
View File
@@ -212,13 +212,13 @@ def test_public_page_data_minimization_and_safe_links(db_session, export):
response = client.get("/admin/council", follow_redirects=False)
assert response.status_code == 200
assert "Иванов Иван Иванович" in response.text and "Доктор технических наук" in response.text
assert "Подтверждённый итог требует документального подтверждения высшей степени" in response.text
assert "Используется высшая обнаруженная степень; её документальное подтверждение проверяется отдельно." in response.text
assert "CSV по критериям" not in response.text and "ВСЕГО" in response.text and "Все публикации" in response.text
assert "Книга" in response.text and "Тип не указан" in response.text
assert "&lt;script&gt;" in response.text and "<script>" not in response.text
assert "javascript:" not in response.text and "private@example.org" not in response.text
assert "/admin/employees/" not in response.text and "/admin/logout" not in response.text
assert "Backend 0.16.2 · Frontend 0.16.2" in response.text
assert "Backend 0.16.3 · Frontend 0.16.3" in response.text
assert "Вход в админку" in response.text
assert client.get("/admin/directory", follow_redirects=False).status_code in (302, 303, 401, 403)
assert "Сотрудники не найдены" in client.get("/admin/council?q=missing").text