From d07711f6659159eade3b695e08b93ebf9afef4f8 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 27 Aug 2026 17:29:16 +0300 Subject: [PATCH 1/2] fix: display all academic degrees --- CHANGELOG.md | 4 ++++ app/services/academic_degrees.py | 18 ++++++++++++++---- app/version.py | 6 +++--- tests/test_academic_degrees.py | 26 ++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 tests/test_academic_degrees.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ea18dd..50b7e5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.7.8 + +- В колонке учёной степени отображаются все найденные степени без лишнего текста. + ## 0.7.7 - Удалена неиспользуемая интеграция обмена данными и связанная документация и тесты. diff --git a/app/services/academic_degrees.py b/app/services/academic_degrees.py index 5962f9a..de7698e 100644 --- a/app/services/academic_degrees.py +++ b/app/services/academic_degrees.py @@ -2,13 +2,16 @@ import re from typing import Any -_PATTERN = re.compile(r"\b(?:кандидат|доктор)\s+[\w\s-]{0,80}?\s+наук\b|\bph\.?\s*d\.?\b", re.IGNORECASE) +_PATTERN = re.compile(r"\b(?:кандидат|доктор)(?:\s+[\w-]+){0,12}\s+наук\b|\bph\.?\s*d\.?(?!\w)", re.IGNORECASE) def academic_degrees(data: dict[str, Any] | None) -> list[str]: degrees = [] + seen = set() for section in (data or {}).get("sections") or []: - if not isinstance(section, dict) or not re.search(r"уч[её]н.*степен|academic degree", str(section.get("title") or ""), re.IGNORECASE): + if not isinstance(section, dict) or not re.search( + r"образован|степен|academic degree|education", str(section.get("title") or ""), re.IGNORECASE + ): continue values = [ *(entry.get("text") for entry in section.get("year_entries") or [] if isinstance(entry, dict)), @@ -16,8 +19,15 @@ def academic_degrees(data: dict[str, Any] | None) -> list[str]: *(section.get("items") or []), section.get("raw_text"), ] + table = section.get("table") or {} + for row in table.get("rows") or []: + if isinstance(row, dict): + values.extend(row.get("cells") or []) for value in values: text = str(value or "").strip() - if text and _PATTERN.search(text) and text not in degrees: - degrees.append(text) + for match in _PATTERN.finditer(text): + degree = match.group(0).strip() + if degree.casefold() not in seen: + seen.add(degree.casefold()) + degrees.append(degree) return degrees diff --git a/app/version.py b/app/version.py index 4732bd6..ad4e6e1 100644 --- a/app/version.py +++ b/app/version.py @@ -1,3 +1,3 @@ -APP_VERSION = "0.7.7" -FRONTEND_VERSION = "0.7.7" -BACKEND_VERSION = "0.7.7" +APP_VERSION = "0.7.8" +FRONTEND_VERSION = "0.7.8" +BACKEND_VERSION = "0.7.8" diff --git a/tests/test_academic_degrees.py b/tests/test_academic_degrees.py new file mode 100644 index 0000000..97c0753 --- /dev/null +++ b/tests/test_academic_degrees.py @@ -0,0 +1,26 @@ +from app.services.academic_degrees import academic_degrees + + +def test_academic_degrees_extracts_all_degree_names_without_surrounding_text(): + data = { + "sections": [ + { + "title": "Образование", + "year_entries": [ + {"text": "2008 — кандидат технических наук, доцент"}, + {"text": "2018 — Доктор физико-математических наук"}, + ], + }, + { + "title": "Учёные степени", + "table": {"rows": [{"cells": ["Ph.D.", "Доктор физико-математических наук"]}]}, + }, + {"title": "Публикации", "items": ["Доктор медицинских наук выступил автором статьи"]}, + ] + } + + assert academic_degrees(data) == [ + "кандидат технических наук", + "Доктор физико-математических наук", + "Ph.D.", + ] -- 2.49.1 From 1d8a854a126d114b1c189dc918c5e7dce81aceb4 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 27 Aug 2026 17:32:04 +0300 Subject: [PATCH 2/2] chore: align package version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 749af30..422d354 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "miem-workers" -version = "0.7.7" +version = "0.7.8" description = "MIEM employees parser, admin API, and web admin" requires-python = ">=3.11" dependencies = [ -- 2.49.1