"""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": ("Основные принципы", "Основные принципы"), "other": ("Прочие документы", "Башка документтер"), "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": ("Конституционный уровень", "Конституциялык деңгээл"), "legislative": ("Законодательный уровень", "Мыйзам деңгээли"), "subordinate": ("Подзаконный уровень", "Мыйзам алдындагы деңгээл"), } LEGAL_FORCE_BY_DOCUMENT_TYPE = { "constitution": "constitutional", "constitutional_law": "constitutional", "code": "legislative", "law": "legislative", "decree": "subordinate", "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]: try: ru, ky = CATALOGS[category][code] except KeyError as error: raise ValueError(f"Unknown {category} catalog code: {code}") from error return {"ru": ru, "ky": ky} 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: 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}") def authority_codes(paths: list[dict]) -> list[str]: codes = set() for path in paths: text = " ".join(path.get("ru", []) + path.get("ky", [])).lower() if "президент" in text: codes.add("president") elif "жогорку кенеш" in text or "верховный совет" in text or "мыйзам чыгаруу" in text: codes.add("parliament") elif "кабинет министров" in text or "правительство" in text or "өкмөт" in text: codes.add("cabinet") elif "министер" in text or "мамлекеттик комитет" in text: codes.add("ministries_and_committees") elif "административ" in text: codes.add("administrative_agencies") elif "национальн" in text and "банк" in text or "улуттук банк" in text: codes.add("national_bank") elif "кенеш" in text or "кеңеш" in text or "айыл" in text or "местного самоуправления" in text: codes.add("local_representative_bodies") elif "иные государственные" in text or "башка мамлекеттик" in text: codes.add("other_state_bodies") else: codes.add("other") return sorted(codes) or ["other"] def legal_force_code(document_type: dict | None) -> str | None: return LEGAL_FORCE_BY_DOCUMENT_TYPE.get(source_code("document_type", document_type))