"""Загрузка справочников норм RACION (БД → JSON fallback).""" from __future__ import annotations import json from functools import lru_cache from pathlib import Path _SEED_DIR = Path(__file__).resolve().parents[4] / "data" / "seed" / "racion" def _read_json(name: str) -> dict: path = _SEED_DIR / name if not path.exists(): raise FileNotFoundError(f"Справочник не найден: {path}") return json.loads(path.read_text(encoding="utf-8")) def _load_from_db(loader_name: str) -> dict | None: try: from flask import has_app_context if not has_app_context(): return None from app.modules.zootech.lab.services.racion_reference import ( load_moskwa_lactir_from_db, load_normy_info_from_db, load_piter_lactir_from_db, ) loaders = { "moskwa": load_moskwa_lactir_from_db, "piter": load_piter_lactir_from_db, "info": load_normy_info_from_db, } fn = loaders.get(loader_name) if fn is None: return None data = fn() return data if data else None except Exception: return None @lru_cache(maxsize=1) def load_moskwa_lactir() -> dict: data = _load_from_db("moskwa") if data: return data return _read_json("moskwa_lactir.json") @lru_cache(maxsize=1) def load_piter_lactir() -> dict: data = _load_from_db("piter") if data: return data return _read_json("piter_lactir.json") @lru_cache(maxsize=1) def load_normy_info() -> dict: data = _load_from_db("info") if data: return data try: return _read_json("normy_info.json") except FileNotFoundError: return {"rows": [], "mass_kg_values": [400, 450, 500, 550, 600, 650, 700, 750]} def clear_tables_cache() -> None: load_moskwa_lactir.cache_clear() load_piter_lactir.cache_clear() load_normy_info.cache_clear()