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 26a0911..d63ed8b 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,13 @@ Telegram-бот — только часть рабочего окружения ## Текущее состояние Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и backend версии -`0.9.0`: добавлена фильтрация поиска по юридической силе. +`0.9.1`: добавлены фильтры по юридической силе и статусу, каталог сохраняет +документы с неучтёнными исходными типами. | Компонент | Версия | Состояние | |---|---:|---| | Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния | -| Backend | `0.9.0` | фильтр поиска по юридической силе и черновик тематического каталога | +| Backend | `0.9.1` | фильтры поиска по юридической силе и статусу документа; неизвестные типы сохранены в индексе | | Frontend | — | ещё не создан | | Сбор и обработка правовых данных | `0.8.0` | добавлены relevance set и оценка выдачи | | RAG и база знаний | — | ещё не созданы | @@ -58,4 +59,4 @@ python3 -m unittest discover -s tools/telegram-bot -v --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.0 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.1 · Frontend — не создан diff --git a/backend/README.md b/backend/README.md index 2463aeb..d73dfb0 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,6 +1,6 @@ # Backend Акылдаш -Версия: `0.9.0` +Версия: `0.9.1` Первая backend-область проекта — загрузка правовых документов из официального Open Data API ЦБД Минюста Кыргызской Республики. Код расположен в @@ -240,4 +240,4 @@ PYTHONPATH=backend python3 -m search.query "ЖЧК ачуу тартиби" --la --- -Акылдаш · Backend v0.9.0 · Frontend — не создан +Акылдаш · Backend v0.9.1 · Frontend — не создан diff --git a/backend/ingestion/minjust_cbd.py b/backend/ingestion/minjust_cbd.py index 7cbac08..45e0eea 100644 --- a/backend/ingestion/minjust_cbd.py +++ b/backend/ingestion/minjust_cbd.py @@ -21,7 +21,7 @@ from datetime import datetime, timezone from pathlib import Path from typing import Callable, Iterable -APP_VERSION = "0.9.0" +APP_VERSION = "0.9.1" API_BASE_URL = "https://cbd.minjust.gov.kg/api/v1/OpenData/" LANGUAGES = {"Rus": "ru", "Kyr": "ky"} IMAGE_LANGUAGES = {"Russian": "ru", "Kyrgyz": "ky"} diff --git a/backend/normalization/minjust_cbd.py b/backend/normalization/minjust_cbd.py index 90ead3b..cf8df30 100644 --- a/backend/normalization/minjust_cbd.py +++ b/backend/normalization/minjust_cbd.py @@ -23,7 +23,7 @@ from pathlib import Path from typing import Callable from urllib.parse import urlsplit -APP_VERSION = "0.9.0" +APP_VERSION = "0.9.1" SCHEMA_VERSION = "1" NORMALIZER_VERSION = "1.0.0" LANGUAGES = ("ru", "ky") diff --git a/backend/search/catalog.py b/backend/search/catalog.py index 4f66bca..4bd34fb 100644 --- a/backend/search/catalog.py +++ b/backend/search/catalog.py @@ -1,9 +1,9 @@ """Immutable v1 search catalogs.""" DOCUMENT_TYPES = { - "constitution": ("Конституция", "Конституция"), "constitutional_law": ("Конституционный Закон", "Конституциалык Мыйзам"), "code": ("Кодекс", "Кодекс"), "law": ("Закон", "Мыйзам"), "decree": ("Указ", "Жарлык"), "resolution": ("Постановление", "Токтом"), "order": ("Распоряжение", "Распоряжение"), "instruction": ("Инструкция", "Инструкция"), "rules": ("Правила", "Правила"), "procedure": ("Порядок", "Порядок"), "provision": ("Положение", "Жобо"), "regulation": ("Регламент", "Регламент"), "charter": ("Устав", "Жобо (Устав)"), "program": ("Программа", "Программа"), "plan": ("План", "План"), "strategy": ("Стратегия", "Стратегия"), "concept": ("Концепция", "Концепция"), "doctrine": ("Доктрина", "Доктрина"), "agreement": ("Соглашение", "Соглашение"), "declaration": ("Декларация", "Декларация"), "registry": ("Реестр", "Реестр"), "norms": ("Нормативы", "Нормативы"), "model": ("Модель", "Модель"), "matrix": ("Матрица", "Матрица"), "study": ("Исследование", "Исследование"), "report": ("Доклад", "Доклад"), "principles": ("Основные принципы", "Основные принципы"), "unspecified": ("Не указан", "Көрсөтүлгөн эмес"), + "constitution": ("Конституция", "Конституция"), "constitutional_law": ("Конституционный Закон", "Конституциалык Мыйзам"), "code": ("Кодекс", "Кодекс"), "law": ("Закон", "Мыйзам"), "decree": ("Указ", "Жарлык"), "resolution": ("Постановление", "Токтом"), "order": ("Распоряжение", "Распоряжение"), "instruction": ("Инструкция", "Инструкция"), "rules": ("Правила", "Правила"), "procedure": ("Порядок", "Порядок"), "provision": ("Положение", "Жобо"), "regulation": ("Регламент", "Регламент"), "charter": ("Устав", "Жобо (Устав)"), "program": ("Программа", "Программа"), "plan": ("План", "План"), "strategy": ("Стратегия", "Стратегия"), "concept": ("Концепция", "Концепция"), "doctrine": ("Доктрина", "Доктрина"), "agreement": ("Соглашение", "Соглашение"), "declaration": ("Декларация", "Декларация"), "registry": ("Реестр", "Реестр"), "norms": ("Нормативы", "Нормативы"), "model": ("Модель", "Модель"), "matrix": ("Матрица", "Матрица"), "study": ("Исследование", "Исследование"), "report": ("Доклад", "Доклад"), "principles": ("Основные принципы", "Основные принципы"), "other": ("Прочие документы", "Башка документтер"), "unspecified": ("Не указан", "Көрсөтүлгөн эмес"), } -STATUSES = {"active": ("Действует", "Күчүндө"), "repealed": ("Утратил силу", "Күчүн жоготту"), "unspecified": ("Не указан", "Көрсөтүлгөн эмес")} +STATUSES = {"active": ("Действует", "Күчүндө"), "repealed": ("Утратил силу", "Күчүн жоготту"), "not_yet_effective": ("Не вступил в силу", "Күчүнө кире элек"), "canceled": ("Отменено", "Жокко чыгарылды"), "inactive": ("Не действует", "Күчүндө эмес же Колдонулбайт"), "terminated": ("Прекратило действие", "Күчүн токтотту же Колдонуу токтотулган"), "suspended": ("Действие приостановлено", "Күчүнө кирүүсү токтотулган"), "unspecified": ("Не указан", "Көрсөтүлгөн эмес")} AUTHORITIES = {"president": ("Президент", "Президент"), "parliament": ("Органы законодательной власти", "Мыйзам чыгаруу бийлик органдары"), "cabinet": ("Правительство и Кабинет Министров", "Өкмөт жана Министрлер Кабинети"), "ministries_and_committees": ("Министерства и государственные комитеты", "Министрликтер жана мамлекеттик комитеттер"), "administrative_agencies": ("Административные ведомства", "Административдик ведомстволор"), "national_bank": ("Национальный банк", "Улуттук банк"), "other_state_bodies": ("Иные государственные органы", "Башка мамлекеттик органдар"), "local_representative_bodies": ("Представительные органы местного самоуправления", "Жергиликтүү өз алдынча башкаруунун өкүлчүлүктүү органдары"), "other": ("Прочие органы", "Башка органдар")} LEGAL_FORCE_LEVELS = { "constitutional": ("Конституционный уровень", "Конституциялык деңгээл"), @@ -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,9 +39,14 @@ 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": + return "other" raise ValueError(f"Unmapped {category} catalog value: {pair!r}") diff --git a/backend/search/minjust_opensearch.py b/backend/search/minjust_opensearch.py index 254965d..dd153ee 100644 --- a/backend/search/minjust_opensearch.py +++ b/backend/search/minjust_opensearch.py @@ -17,7 +17,7 @@ from typing import Iterator from search.catalog import authority_codes, legal_force_code, source_code -APP_VERSION = "0.9.0" +APP_VERSION = "0.9.1" LANGUAGES = {"ru", "ky"} DEFAULT_MAPPING = Path(__file__).with_name("minjust-fragments-index.json") diff --git a/backend/search/review.html b/backend/search/review.html index 0e032d4..55df233 100644 --- a/backend/search/review.html +++ b/backend/search/review.html @@ -75,7 +75,7 @@