fix: recover expired Ministry document lists
This commit is contained in:
@@ -10,14 +10,14 @@ Telegram-бот — только часть рабочего окружения
|
||||
## Текущее состояние
|
||||
|
||||
Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и первая backend-функция
|
||||
версии `0.1.1`: возобновляемая выгрузка документов из ЦБД Минюста КР.
|
||||
версии `0.1.2`: возобновляемая выгрузка документов из ЦБД Минюста КР.
|
||||
|
||||
| Компонент | Версия | Состояние |
|
||||
|---|---:|---|
|
||||
| Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния |
|
||||
| Backend | `0.1.1` | реализована выгрузка документов ЦБД Минюста КР |
|
||||
| Backend | `0.1.2` | реализована выгрузка документов ЦБД Минюста КР |
|
||||
| Frontend | — | ещё не создан |
|
||||
| Сбор и обработка правовых данных | `0.1.1` | реализован архиватор ЦБД Минюста КР |
|
||||
| Сбор и обработка правовых данных | `0.1.2` | реализован архиватор ЦБД Минюста КР |
|
||||
| RAG и база знаний | — | ещё не созданы |
|
||||
|
||||
## Структура репозитория
|
||||
@@ -57,4 +57,4 @@ python3 -m unittest discover -s tools/telegram-bot -v
|
||||
|
||||
---
|
||||
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.1 · Frontend — не создан
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.2 · Frontend — не создан
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Backend Акылдаш
|
||||
|
||||
Версия: `0.1.1`
|
||||
Версия: `0.1.2`
|
||||
|
||||
Первая backend-область проекта — загрузка правовых документов из официального
|
||||
Open Data API ЦБД Минюста Кыргызской Республики. Код расположен в
|
||||
@@ -21,6 +21,8 @@ python3 backend/ingestion/minjust_cbd.py --limit 10
|
||||
Полная загрузка выполняется без `--limit`. По умолчанию архив сохраняется в
|
||||
`data/minjust-cbd`, который исключён из Git. Повторный запуск пропускает уже
|
||||
загруженные документы; `--refresh` принудительно проверяет их заново.
|
||||
Если временный идентификатор списка API истечёт во время многодневной загрузки,
|
||||
скрипт пересоздаст список на текущей странице и продолжит автоматически.
|
||||
|
||||
В версии `0.1.0` обновление существующих документов выполняется полной проверкой
|
||||
через `--refresh`. Инкрементальную проверку по `lastmod` из sitemap следует
|
||||
@@ -59,4 +61,4 @@ PYTHONPATH=backend python3 -m unittest backend/test_minjust_cbd.py -v
|
||||
|
||||
---
|
||||
|
||||
Акылдаш · Backend v0.1.1 · Frontend — не создан
|
||||
Акылдаш · Backend v0.1.2 · Frontend — не создан
|
||||
|
||||
@@ -21,7 +21,7 @@ from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
from typing import Callable, Iterable
|
||||
|
||||
APP_VERSION = "0.1.1"
|
||||
APP_VERSION = "0.1.2"
|
||||
API_BASE_URL = "https://cbd.minjust.gov.kg/api/v1/OpenData/"
|
||||
LANGUAGES = {"Rus": "ru", "Kyr": "ky"}
|
||||
IMAGE_LANGUAGES = {"Russian": "ru", "Kyrgyz": "ky"}
|
||||
@@ -87,10 +87,17 @@ class CbdClient:
|
||||
self.request_json("CheckAvailable")
|
||||
|
||||
def document_codes(self, limit: int | None = None, page_size: int = 1000):
|
||||
first = self.request_json(
|
||||
"GetDocumentListByQuery",
|
||||
(("Property", "Code"), ("PageSize", page_size), ("PageNumber", 1)),
|
||||
)
|
||||
def query_page(page_number: int):
|
||||
return self.request_json(
|
||||
"GetDocumentListByQuery",
|
||||
(
|
||||
("Property", "Code"),
|
||||
("PageSize", page_size),
|
||||
("PageNumber", page_number),
|
||||
),
|
||||
)
|
||||
|
||||
first = query_page(1)
|
||||
yielded = 0
|
||||
page = first
|
||||
page_number = 1
|
||||
@@ -104,15 +111,23 @@ class CbdClient:
|
||||
if yielded >= page["TotalCount"]:
|
||||
return
|
||||
page_number += 1
|
||||
page = self.request_json(
|
||||
"GetDocumentListById",
|
||||
(
|
||||
("DocumentListId", first["Id"]),
|
||||
("Property", "Code"),
|
||||
("PageSize", page_size),
|
||||
("PageNumber", page_number),
|
||||
),
|
||||
)
|
||||
try:
|
||||
page = self.request_json(
|
||||
"GetDocumentListById",
|
||||
(
|
||||
("DocumentListId", first["Id"]),
|
||||
("Property", "Code"),
|
||||
("PageSize", page_size),
|
||||
("PageNumber", page_number),
|
||||
),
|
||||
)
|
||||
except urllib.error.HTTPError as error:
|
||||
if error.code != 404:
|
||||
raise
|
||||
first = page = query_page(page_number)
|
||||
self.total_documents = min(
|
||||
first["TotalCount"], limit or first["TotalCount"]
|
||||
)
|
||||
|
||||
def document(self, code: int) -> dict:
|
||||
return self.request_json(
|
||||
@@ -306,7 +321,7 @@ def sync_archive(
|
||||
SyncResult(discovered, downloaded, skipped, failed),
|
||||
client.total_documents,
|
||||
)
|
||||
if discovered % 100 == 0:
|
||||
if not progress and discovered % 100 == 0:
|
||||
LOGGER.info(
|
||||
"discovered=%s downloaded=%s skipped=%s failed=%s",
|
||||
discovered,
|
||||
|
||||
@@ -76,6 +76,29 @@ class MinjustCbdTest(unittest.TestCase):
|
||||
client.request_json.call_args_list[1].args[0], "GetDocumentListById"
|
||||
)
|
||||
|
||||
def test_recreates_expired_list_at_current_page(self):
|
||||
client = CbdClient(requests_per_second=1000)
|
||||
client.request_json = Mock(
|
||||
side_effect=[
|
||||
{
|
||||
"Id": "expired-list",
|
||||
"TotalCount": 3,
|
||||
"Documents": [{"Code": 1}, {"Code": 2}],
|
||||
},
|
||||
urllib.error.HTTPError("https://example.test", 404, "", {}, None),
|
||||
{
|
||||
"Id": "new-list",
|
||||
"TotalCount": 3,
|
||||
"Documents": [{"Code": 3}],
|
||||
},
|
||||
]
|
||||
)
|
||||
|
||||
self.assertEqual(list(client.document_codes(page_size=2)), [1, 2, 3])
|
||||
recovery_call = client.request_json.call_args_list[2]
|
||||
self.assertEqual(recovery_call.args[0], "GetDocumentListByQuery")
|
||||
self.assertIn(("PageNumber", 2), recovery_call.args[1])
|
||||
|
||||
def test_formats_progress_with_rate_and_eta(self):
|
||||
line = progress_line(
|
||||
SyncResult(discovered=50, downloaded=48, skipped=1, failed=1),
|
||||
|
||||
@@ -29,4 +29,4 @@
|
||||
|
||||
---
|
||||
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.1 · Frontend — не создан
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.2 · Frontend — не создан
|
||||
|
||||
@@ -78,4 +78,4 @@ Telegram позволяет запретить пользователям отп
|
||||
|
||||
---
|
||||
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.1 · Frontend — не создан
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.2 · Frontend — не создан
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
- Telegram-бот: `0.2.2`
|
||||
- Telegram-бот на Synology: `0.2.1`
|
||||
- Backend: `0.1.1`
|
||||
- Backend: `0.1.2`
|
||||
- Frontend: не создан
|
||||
|
||||
## Краткий итог
|
||||
@@ -67,7 +67,7 @@
|
||||
- Локальный Git-репозиторий восстановлен и привязан к Gitea.
|
||||
- Репозиторий организован как основа всего проекта, а не отдельного бота.
|
||||
- Бот развёрнут в Container Manager на Synology; автозапуск после перезапуска менеджера проверен.
|
||||
- Реализован backend-загрузчик ЦБД Минюста КР версии `0.1.1` без внешних зависимостей.
|
||||
- Реализован backend-загрузчик ЦБД Минюста КР версии `0.1.2` без внешних зависимостей.
|
||||
- Загрузчик сохраняет метаданные, редакции RU/KY и изображения, а прогресс — в SQLite.
|
||||
- Пилотная выгрузка двух документов и возобновление без повторного скачивания проверены на живом API.
|
||||
|
||||
@@ -132,7 +132,8 @@
|
||||
|
||||
- Добавлен терминальный прогрессбар со скоростью и расчётным временем завершения.
|
||||
- Обработка HTTP 429 учитывает рекомендованную сервером задержку `Retry-After`.
|
||||
- Версия backend обновлена до `0.1.1`.
|
||||
- Добавлено автоматическое восстановление после истечения серверного списка документов.
|
||||
- Версия backend обновлена до `0.1.2`.
|
||||
|
||||
### 2026-08-05
|
||||
|
||||
@@ -177,4 +178,4 @@
|
||||
|
||||
---
|
||||
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.1 · Frontend — не создан
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.2 · Frontend — не создан
|
||||
|
||||
@@ -398,4 +398,4 @@ Git сохраняет актуальную версию
|
||||
|
||||
---
|
||||
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.1 · Frontend — не создан
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.2 · Frontend — не создан
|
||||
|
||||
@@ -44,4 +44,4 @@
|
||||
|
||||
---
|
||||
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.1 · Frontend — не создан
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.2 · Frontend — не создан
|
||||
|
||||
@@ -180,4 +180,4 @@
|
||||
|
||||
---
|
||||
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.1 · Frontend — не создан
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.2 · Frontend — не создан
|
||||
|
||||
@@ -48,4 +48,4 @@ python3 -m unittest -v
|
||||
|
||||
---
|
||||
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.1 · Frontend — не создан
|
||||
Акылдаш · Telegram-бот v0.2.2 · Backend v0.1.2 · Frontend — не создан
|
||||
|
||||
Reference in New Issue
Block a user