78 lines
2.9 KiB
Python
78 lines
2.9 KiB
Python
"""Helpers for managing import template files used by administrators."""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
from datetime import datetime, timezone
|
|
from typing import Any, Dict
|
|
|
|
|
|
PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
|
|
TEMPLATE_DIR = os.path.join(PROJECT_ROOT, "data", "template")
|
|
PERMIT_TEMPLATE_FILENAME = "风险提示表 模板.xlsx"
|
|
TEMPLATE_META_FILENAME = "template_meta.json"
|
|
|
|
|
|
def get_permit_template_path() -> str:
|
|
"""Return the absolute path to the permit import template."""
|
|
return os.path.join(TEMPLATE_DIR, PERMIT_TEMPLATE_FILENAME)
|
|
|
|
|
|
def _meta_path() -> str:
|
|
return os.path.join(TEMPLATE_DIR, TEMPLATE_META_FILENAME)
|
|
|
|
|
|
def _read_meta() -> Dict[str, Any]:
|
|
path = _meta_path()
|
|
if not os.path.exists(path):
|
|
return {}
|
|
try:
|
|
with open(path, "r", encoding="utf-8") as meta_file:
|
|
return json.load(meta_file)
|
|
except (json.JSONDecodeError, OSError):
|
|
return {}
|
|
|
|
|
|
def get_permit_template_metadata() -> Dict[str, Any]:
|
|
"""Return metadata for the permit template file (size, timestamps, uploader)."""
|
|
template_path = get_permit_template_path()
|
|
exists = os.path.exists(template_path)
|
|
metadata = {
|
|
"exists": exists,
|
|
"filename": os.path.basename(template_path),
|
|
"filesize": os.path.getsize(template_path) if exists else 0,
|
|
"updated_at": None,
|
|
"uploaded_by": None,
|
|
"source_filename": None,
|
|
"download_url": "/fs-ai-asistant/api/workflow/lawrisk/admin/permit-import/template",
|
|
}
|
|
meta_file_data = _read_meta()
|
|
metadata.update({k: v for k, v in meta_file_data.items() if k in metadata or k in {"hash"} })
|
|
if metadata.get("updated_at") and isinstance(metadata["updated_at"], (int, float)):
|
|
metadata["updated_at"] = datetime.fromtimestamp(metadata["updated_at"], tz=timezone.utc).isoformat()
|
|
return metadata
|
|
|
|
|
|
def overwrite_permit_template(file_bytes: bytes, filename: str, uploaded_by: str | None = None) -> Dict[str, Any]:
|
|
"""Overwrite the stored permit template with the uploaded bytes."""
|
|
if not file_bytes:
|
|
raise ValueError("模板文件内容不能为空")
|
|
os.makedirs(TEMPLATE_DIR, exist_ok=True)
|
|
target_path = get_permit_template_path()
|
|
with open(target_path, "wb") as template_file:
|
|
template_file.write(file_bytes)
|
|
|
|
timestamp = datetime.now(tz=timezone.utc).isoformat()
|
|
meta_payload = {
|
|
"updated_at": timestamp,
|
|
"uploaded_by": uploaded_by,
|
|
"source_filename": filename,
|
|
"filesize": len(file_bytes),
|
|
"filename": os.path.basename(target_path),
|
|
}
|
|
with open(_meta_path(), "w", encoding="utf-8") as meta_file:
|
|
json.dump(meta_payload, meta_file, ensure_ascii=False, indent=2)
|
|
meta_payload["exists"] = True
|
|
meta_payload["download_url"] = "/fs-ai-asistant/api/workflow/lawrisk/admin/permit-import/template"
|
|
return meta_payload
|