39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
from collections.abc import Iterator
|
|
from contextlib import contextmanager
|
|
from pathlib import Path
|
|
from tempfile import NamedTemporaryFile
|
|
import os
|
|
|
|
from app.native.wndb.inp.exporter import dump_inp
|
|
|
|
|
|
PROJECT_INP_DIRECTORY = Path("db_inp")
|
|
|
|
|
|
@contextmanager
|
|
def temporary_project_inp(
|
|
project_code: str,
|
|
*,
|
|
purpose: str,
|
|
version: str = "2",
|
|
) -> Iterator[Path]:
|
|
"""Export one project model to an isolated INP and remove it afterwards."""
|
|
job_directory = os.environ.get("TJWATER_CALCULATION_JOB_DIR")
|
|
directory = Path(job_directory) / "inp" if job_directory else PROJECT_INP_DIRECTORY
|
|
directory.mkdir(parents=True, exist_ok=True)
|
|
with NamedTemporaryFile(
|
|
dir=directory,
|
|
prefix=f"{purpose}_",
|
|
suffix=".inp",
|
|
delete=False,
|
|
) as temporary_file:
|
|
path = Path(temporary_file.name).resolve()
|
|
|
|
try:
|
|
dump_inp(project_code, str(path), version)
|
|
if not path.is_file() or path.stat().st_size == 0:
|
|
raise ValueError(f"项目 {project_code!r} 的 INP 导出失败")
|
|
yield path
|
|
finally:
|
|
path.unlink(missing_ok=True)
|