Files
iDRAC_Info/backend/routes/xml.py
2025-10-05 17:37:51 +09:00

105 lines
3.7 KiB
Python

from __future__ import annotations
import logging
from pathlib import Path
from flask import Blueprint, render_template, request, redirect, url_for, flash
from flask_login import login_required
from werkzeug.utils import secure_filename
from config import Config
xml_bp = Blueprint("xml", __name__)
def register_xml_routes(app):
app.register_blueprint(xml_bp)
def allowed_file(filename: str) -> bool:
return "." in filename and filename.rsplit(".", 1)[1].lower() in Config.ALLOWED_EXTENSIONS
@xml_bp.route("/xml_management")
@login_required
def xml_management():
xml_dir = Path(Config.XML_FOLDER)
try:
files = [f.name for f in xml_dir.iterdir() if f.is_file()]
except FileNotFoundError:
files = []
flash("XML 폴더가 존재하지 않습니다.", "danger")
return render_template("manage_xml.html", xml_files=files)
@xml_bp.route("/upload_xml", methods=["POST"])
@login_required
def upload_xml():
file = request.files.get("xmlFile")
if not file or not file.filename:
flash("업로드할 파일을 선택하세요.", "warning")
return redirect(url_for("xml.xml_management"))
if allowed_file(file.filename):
filename = secure_filename(file.filename)
save_path = Path(Config.XML_FOLDER) / filename
try:
save_path.parent.mkdir(parents=True, exist_ok=True)
file.save(str(save_path))
# 텍스트 파일이므로 0644 권장
try:
save_path.chmod(0o644)
except Exception:
pass # Windows 등에서 무시
logging.info(f"XML 업로드됨: {filename}")
flash("파일이 성공적으로 업로드되었습니다.", "success")
except Exception as e:
logging.error(f"파일 업로드 오류: {e}")
flash("파일 저장 중 오류가 발생했습니다.", "danger")
else:
flash("XML 확장자만 업로드할 수 있습니다.", "warning")
return redirect(url_for("xml.xml_management"))
@xml_bp.route("/delete_xml/<filename>", methods=["POST"])
@login_required
def delete_xml(filename: str):
path = Path(Config.XML_FOLDER) / secure_filename(filename)
if path.exists():
try:
path.unlink()
flash(f"{filename} 파일이 삭제되었습니다.", "success")
logging.info(f"XML 삭제됨: {filename}")
except Exception as e:
logging.error(f"XML 삭제 오류: {e}")
flash("파일 삭제 중 오류 발생", "danger")
else:
flash("해당 파일이 존재하지 않습니다.", "warning")
return redirect(url_for("xml.xml_management"))
@xml_bp.route("/edit_xml/<filename>", methods=["GET", "POST"])
@login_required
def edit_xml(filename: str):
path = Path(Config.XML_FOLDER) / secure_filename(filename)
if not path.exists():
flash("파일을 찾을 수 없습니다.", "danger")
return redirect(url_for("xml.xml_management"))
if request.method == "POST":
new_content = request.form.get("content", "")
try:
path.write_text(new_content, encoding="utf-8")
logging.info(f"XML 수정됨: {filename}")
flash("파일이 성공적으로 수정되었습니다.", "success")
return redirect(url_for("xml.xml_management"))
except Exception as e:
logging.error(f"XML 저장 실패: {e}")
flash("파일 저장 중 오류가 발생했습니다.", "danger")
try:
content = path.read_text(encoding="utf-8")
except Exception as e:
logging.error(f"XML 열기 실패: {e}")
flash("파일 열기 중 오류가 발생했습니다.", "danger")
content = ""
return render_template("edit_xml.html", filename=filename, content=content)