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/", 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/", 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)