Compare commits
3 Commits
feature/se
...
fix/unmapp
| Author | SHA1 | Date | |
|---|---|---|---|
| 81b085dd9d | |||
| b6ad392ab7 | |||
| bb5edf3ae2 |
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
## Не выпущено
|
## Не выпущено
|
||||||
|
|
||||||
|
- Backend обновлён до `0.9.1`: все статусы из нормализованного корпуса доступны
|
||||||
|
как отдельные фильтры, варианты конституционного закона и указа сопоставляются
|
||||||
|
с подтверждённой юридической силой, неизвестные типы документов сохраняются
|
||||||
|
под общим фильтром без вывода юридической силы.
|
||||||
- Уточнено, что внутренняя лаборатория оценивает выдачу собственного OpenSearch;
|
- Уточнено, что внутренняя лаборатория оценивает выдачу собственного OpenSearch;
|
||||||
ЦБД Минюста служит источником для подтверждения документов, а прежние Excel/PDF
|
ЦБД Минюста служит источником для подтверждения документов, а прежние Excel/PDF
|
||||||
бланки удалены.
|
бланки удалены.
|
||||||
|
|||||||
@@ -10,12 +10,13 @@ Telegram-бот — только часть рабочего окружения
|
|||||||
## Текущее состояние
|
## Текущее состояние
|
||||||
|
|
||||||
Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и backend версии
|
Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и backend версии
|
||||||
`0.9.0`: добавлена фильтрация поиска по юридической силе.
|
`0.9.1`: добавлены фильтры по юридической силе и статусу, каталог сохраняет
|
||||||
|
документы с неучтёнными исходными типами.
|
||||||
|
|
||||||
| Компонент | Версия | Состояние |
|
| Компонент | Версия | Состояние |
|
||||||
|---|---:|---|
|
|---|---:|---|
|
||||||
| Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния |
|
| Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния |
|
||||||
| Backend | `0.9.0` | фильтр поиска по юридической силе и черновик тематического каталога |
|
| Backend | `0.9.1` | фильтры поиска по юридической силе и статусу документа; неизвестные типы сохранены в индексе |
|
||||||
| Frontend | — | ещё не создан |
|
| Frontend | — | ещё не создан |
|
||||||
| Сбор и обработка правовых данных | `0.8.0` | добавлены relevance set и оценка выдачи |
|
| Сбор и обработка правовых данных | `0.8.0` | добавлены relevance set и оценка выдачи |
|
||||||
| RAG и база знаний | — | ещё не созданы |
|
| 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 — не создан
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Backend Акылдаш
|
# Backend Акылдаш
|
||||||
|
|
||||||
Версия: `0.9.0`
|
Версия: `0.9.1`
|
||||||
|
|
||||||
Первая backend-область проекта — загрузка правовых документов из официального
|
Первая backend-область проекта — загрузка правовых документов из официального
|
||||||
Open Data API ЦБД Минюста Кыргызской Республики. Код расположен в
|
Open Data API ЦБД Минюста Кыргызской Республики. Код расположен в
|
||||||
@@ -240,4 +240,4 @@ PYTHONPATH=backend python3 -m search.query "ЖЧК ачуу тартиби" --la
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Акылдаш · Backend v0.9.0 · Frontend — не создан
|
Акылдаш · Backend v0.9.1 · Frontend — не создан
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ from datetime import datetime, timezone
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Callable, Iterable
|
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/"
|
API_BASE_URL = "https://cbd.minjust.gov.kg/api/v1/OpenData/"
|
||||||
LANGUAGES = {"Rus": "ru", "Kyr": "ky"}
|
LANGUAGES = {"Rus": "ru", "Kyr": "ky"}
|
||||||
IMAGE_LANGUAGES = {"Russian": "ru", "Kyrgyz": "ky"}
|
IMAGE_LANGUAGES = {"Russian": "ru", "Kyrgyz": "ky"}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ from pathlib import Path
|
|||||||
from typing import Callable
|
from typing import Callable
|
||||||
from urllib.parse import urlsplit
|
from urllib.parse import urlsplit
|
||||||
|
|
||||||
APP_VERSION = "0.9.0"
|
APP_VERSION = "0.9.1"
|
||||||
SCHEMA_VERSION = "1"
|
SCHEMA_VERSION = "1"
|
||||||
NORMALIZER_VERSION = "1.0.0"
|
NORMALIZER_VERSION = "1.0.0"
|
||||||
LANGUAGES = ("ru", "ky")
|
LANGUAGES = ("ru", "ky")
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
"""Immutable v1 search catalogs."""
|
"""Immutable v1 search catalogs."""
|
||||||
|
|
||||||
DOCUMENT_TYPES = {
|
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": ("Прочие органы", "Башка органдар")}
|
AUTHORITIES = {"president": ("Президент", "Президент"), "parliament": ("Органы законодательной власти", "Мыйзам чыгаруу бийлик органдары"), "cabinet": ("Правительство и Кабинет Министров", "Өкмөт жана Министрлер Кабинети"), "ministries_and_committees": ("Министерства и государственные комитеты", "Министрликтер жана мамлекеттик комитеттер"), "administrative_agencies": ("Административные ведомства", "Административдик ведомстволор"), "national_bank": ("Национальный банк", "Улуттук банк"), "other_state_bodies": ("Иные государственные органы", "Башка мамлекеттик органдар"), "local_representative_bodies": ("Представительные органы местного самоуправления", "Жергиликтүү өз алдынча башкаруунун өкүлчүлүктүү органдары"), "other": ("Прочие органы", "Башка органдар")}
|
||||||
LEGAL_FORCE_LEVELS = {
|
LEGAL_FORCE_LEVELS = {
|
||||||
"constitutional": ("Конституционный уровень", "Конституциялык деңгээл"),
|
"constitutional": ("Конституционный уровень", "Конституциялык деңгээл"),
|
||||||
@@ -19,6 +19,12 @@ LEGAL_FORCE_BY_DOCUMENT_TYPE = {
|
|||||||
"resolution": "subordinate",
|
"resolution": "subordinate",
|
||||||
}
|
}
|
||||||
CATALOGS = {"document_type": DOCUMENT_TYPES, "status": STATUSES, "authority": AUTHORITIES, "legal_force": LEGAL_FORCE_LEVELS}
|
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]:
|
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"))
|
pair = ((value or {}).get("ru"), (value or {}).get("ky"))
|
||||||
if pair == (None, None):
|
if pair == (None, None):
|
||||||
return "unspecified"
|
return "unspecified"
|
||||||
|
if category == "document_type" and pair in DOCUMENT_TYPE_ALIASES:
|
||||||
|
return DOCUMENT_TYPE_ALIASES[pair]
|
||||||
for code, expected in CATALOGS[category].items():
|
for code, expected in CATALOGS[category].items():
|
||||||
if pair == expected or category == "document_type" and code == "provision" and pair == ("Положение", "Положение"):
|
if pair == expected:
|
||||||
return code
|
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}")
|
raise ValueError(f"Unmapped {category} catalog value: {pair!r}")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ from typing import Iterator
|
|||||||
|
|
||||||
from search.catalog import authority_codes, legal_force_code, source_code
|
from search.catalog import authority_codes, legal_force_code, source_code
|
||||||
|
|
||||||
APP_VERSION = "0.9.0"
|
APP_VERSION = "0.9.1"
|
||||||
LANGUAGES = {"ru", "ky"}
|
LANGUAGES = {"ru", "ky"}
|
||||||
DEFAULT_MAPPING = Path(__file__).with_name("minjust-fragments-index.json")
|
DEFAULT_MAPPING = Path(__file__).with_name("minjust-fragments-index.json")
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@
|
|||||||
<div class="review__actions"><label>Проверяющий <input id="reviewer" maxlength="120" autocomplete="name"></label> <label>Общий комментарий <input id="overall-comment" maxlength="4000"></label> <button class="review__button--primary" id="save" type="button">Сохранить оценку</button></div>
|
<div class="review__actions"><label>Проверяющий <input id="reviewer" maxlength="120" autocomplete="name"></label> <label>Общий комментарий <input id="overall-comment" maxlength="4000"></label> <button class="review__button--primary" id="save" type="button">Сохранить оценку</button></div>
|
||||||
<dialog id="document-dialog"><button class="review__dialog-close" id="dialog-close" type="button">Закрыть</button><h2 id="dialog-heading">Документ</h2><div class="review__document-body" id="dialog-body"></div></dialog>
|
<dialog id="document-dialog"><button class="review__dialog-close" id="dialog-close" type="button">Закрыть</button><h2 id="dialog-heading">Документ</h2><div class="review__document-body" id="dialog-body"></div></dialog>
|
||||||
<div class="review__status review__status--error" id="error" role="alert" aria-live="assertive"></div>
|
<div class="review__status review__status--error" id="error" role="alert" aria-live="assertive"></div>
|
||||||
<footer class="review__header">Акылдаш · Backend v0.9.0 · Внутренняя лаборатория релевантности</footer>
|
<footer class="review__header">Акылдаш · Backend v0.9.1 · Внутренняя лаборатория релевантности</footer>
|
||||||
<script>
|
<script>
|
||||||
const DRAFT_KEY = 'akyldash-search-review-draft';
|
const DRAFT_KEY = 'akyldash-search-review-draft';
|
||||||
const state = { results: [], token: '', selected: null, query: '' };
|
const state = { results: [], token: '', selected: null, query: '' };
|
||||||
|
|||||||
@@ -9,10 +9,22 @@ from contextlib import closing
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
from search.catalog import legal_force_code, labels, source_code
|
||||||
from search.minjust_opensearch import bulk_batches, document_codes, export_bulk, load_bulk, request_json, switch_alias
|
from search.minjust_opensearch import bulk_batches, document_codes, export_bulk, load_bulk, request_json, switch_alias
|
||||||
|
|
||||||
|
|
||||||
class MinjustOpenSearchTest(unittest.TestCase):
|
class MinjustOpenSearchTest(unittest.TestCase):
|
||||||
|
def test_unknown_document_type_keeps_source_label_and_has_no_inferred_force(self):
|
||||||
|
value = {"ru": "Решение", "ky": "Решение"}
|
||||||
|
|
||||||
|
self.assertEqual(source_code("document_type", value), "other")
|
||||||
|
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):
|
def test_switches_alias_atomically_after_successful_load(self):
|
||||||
with patch("search.minjust_opensearch.request_json", return_value={"acknowledged": True}) as request:
|
with patch("search.minjust_opensearch.request_json", return_value={"acknowledged": True}) as request:
|
||||||
switch_alias("http://127.0.0.1:9200/", "akyldash-fragments-v2", "akyldash-fragments-current")
|
switch_alias("http://127.0.0.1:9200/", "akyldash-fragments-v2", "akyldash-fragments-current")
|
||||||
|
|||||||
@@ -39,4 +39,4 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.0 · Frontend — не создан
|
Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.1 · Frontend — не создан
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
- Telegram-бот: `0.2.2`
|
- Telegram-бот: `0.2.2`
|
||||||
- Telegram-бот на Synology: `0.2.1`
|
- Telegram-бот на Synology: `0.2.1`
|
||||||
- Backend: `0.9.0`
|
- Backend: `0.9.1`
|
||||||
- Frontend: не создан
|
- Frontend: не создан
|
||||||
|
|
||||||
## Краткий итог
|
## Краткий итог
|
||||||
@@ -262,4 +262,4 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.0 · Frontend — не создан
|
Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.1 · Frontend — не создан
|
||||||
|
|||||||
Reference in New Issue
Block a user