From 81b085dd9da8bef504cc715cc7bcd7e5f859dccb Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Tue, 15 Sep 2026 01:04:22 +0300 Subject: [PATCH] Record catalog normalization in changelog --- CHANGELOG.md | 4 ++++ README.md | 3 ++- backend/search/catalog.py | 10 +++++++++- backend/test_minjust_opensearch.py | 3 +++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc18e28..f14dbef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Не выпущено +- Backend обновлён до `0.9.1`: все статусы из нормализованного корпуса доступны + как отдельные фильтры, варианты конституционного закона и указа сопоставляются + с подтверждённой юридической силой, неизвестные типы документов сохраняются + под общим фильтром без вывода юридической силы. - Уточнено, что внутренняя лаборатория оценивает выдачу собственного OpenSearch; ЦБД Минюста служит источником для подтверждения документов, а прежние Excel/PDF бланки удалены. diff --git a/README.md b/README.md index c86d5b7..d63ed8b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ Telegram-бот — только часть рабочего окружения ## Текущее состояние Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и backend версии -`0.9.0`: добавлена фильтрация поиска по юридической силе. +`0.9.1`: добавлены фильтры по юридической силе и статусу, каталог сохраняет +документы с неучтёнными исходными типами. | Компонент | Версия | Состояние | |---|---:|---| diff --git a/backend/search/catalog.py b/backend/search/catalog.py index a5f7d80..4bd34fb 100644 --- a/backend/search/catalog.py +++ b/backend/search/catalog.py @@ -19,6 +19,12 @@ LEGAL_FORCE_BY_DOCUMENT_TYPE = { "resolution": "subordinate", } CATALOGS = {"document_type": DOCUMENT_TYPES, "status": STATUSES, "authority": AUTHORITIES, "legal_force": LEGAL_FORCE_LEVELS} +DOCUMENT_TYPE_ALIASES = { + ("Положение", "Положение"): "provision", + ("Конституционный закон", "Конституционный закон"): "constitutional_law", + ("Указ", "Жарлыгы"): "decree", + ("устав", None): "charter", +} def labels(category: str, code: str) -> dict[str, str]: @@ -33,8 +39,10 @@ def source_code(category: str, value: dict | None) -> str: pair = ((value or {}).get("ru"), (value or {}).get("ky")) if pair == (None, None): return "unspecified" + if category == "document_type" and pair in DOCUMENT_TYPE_ALIASES: + return DOCUMENT_TYPE_ALIASES[pair] for code, expected in CATALOGS[category].items(): - if pair == expected or category == "document_type" and code == "provision" and pair == ("Положение", "Положение"): + if pair == expected: return code # ponytail: uncurated source types share one filter; add reviewed codes when separate filtering is needed. if category == "document_type": diff --git a/backend/test_minjust_opensearch.py b/backend/test_minjust_opensearch.py index 9399152..ad60f5e 100644 --- a/backend/test_minjust_opensearch.py +++ b/backend/test_minjust_opensearch.py @@ -21,6 +21,9 @@ class MinjustOpenSearchTest(unittest.TestCase): self.assertEqual(labels("document_type", "other"), {"ru": "Прочие документы", "ky": "Башка документтер"}) self.assertIsNone(legal_force_code(value)) self.assertEqual(source_code("status", {"ru": "Не вступил в силу", "ky": "Күчүнө кире элек"}), "not_yet_effective") + self.assertEqual(legal_force_code({"ru": "Конституционный закон", "ky": "Конституционный закон"}), "constitutional") + self.assertEqual(legal_force_code({"ru": "Указ", "ky": "Жарлыгы"}), "subordinate") + self.assertEqual(source_code("document_type", {"ru": "устав"}), "charter") def test_switches_alias_atomically_after_successful_load(self): with patch("search.minjust_opensearch.request_json", return_value={"acknowledged": True}) as request: