76 lines
1.9 KiB
Python
76 lines
1.9 KiB
Python
"""Загрузка справочников норм 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.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()
|