From 2a89d541b479a6f847270b708cbd4f20f8607061 Mon Sep 17 00:00:00 2001 From: peregr1nus Date: Fri, 12 Dec 2025 16:43:57 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EB=B0=8F=20README=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 125 +++++++++++++++++++++++++++++++--------- app.py | 4 -- utils/word_processor.py | 4 +- 3 files changed, 100 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 8b6a5a5..9ad27c5 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,24 @@ ## 주요 기능 -1. **설문응답자 기본 정보 입력** - 이름, 생년월일, 연락처, 출신 이단, 재적 기간 -2. **기독교대한감리회 신앙고백 교리 점검** - 삼위일체, 예수 그리스도, 성경, 구원 등 -3. **이단 일반 교리 점검** - 추가 계시, 지도자 신격화, 구원관, 세계관 -4. **출신 이단별 교리 점검** - 각 이단별 특정 교리 점검 -5. **간증문 입력** - 탈퇴 과정과 소감 작성 -6. **워드 문서 자동 생성** - 응답 내용을 워드 템플릿에 자동 입력 -7. **구글 드라이브 자동 업로드** - 생성된 문서를 구글 드라이브에 업로드 +1. **접근 인증** - 인증키를 통한 접근 제어 (링크를 받은 사람만 사용 가능) +2. **설문응답자 기본 정보 입력** - 이름, 교구, 이단교단 (기타 선택 시 직접 입력) +3. **기독교대한감리회 신앙고백 교리 점검** - 8개 문항 (예/아니오/모르겠습니다) +4. **이단 일반 교리 점검** - 17개 문항 (예/아니오/모르겠습니다, 7번은 기타의견란 작성) +5. **이단 상세 점검** - 선택한 이단에 따라 다른 문항 (예/아니오/모르겠습니다, 일부는 기타의견란 작성) +6. **간증문 입력** - 상담 소감 작성 +7. **워드 문서 자동 생성** - 응답 내용을 워드 문서로 자동 생성 (표 형식) +8. **구글 드라이브 자동 업로드** - 생성된 문서를 구글 드라이브에 업로드 (선택사항) + +## 설문 흐름 + +1. **인증** - 인증키 입력 +2. **1단계: 기본 정보** - 이름, 교구, 이단교단 입력 +3. **2단계: 감리교 신앙고백** - 8개 문항 +4. **3단계: 이단 일반 점검** - 17개 문항 +5. **4단계: 이단 상세 점검** - 이단별 문항 (기타 선택 시 건너뜀) +6. **5단계: 간증문** - 상담 소감 작성 +7. **완료** - 제출 완료 및 로그아웃 ## 설치 방법 @@ -38,7 +49,7 @@ GOOGLE_DRIVE_FOLDER_ID=your-google-drive-folder-id - 사용자는 이 인증키를 입력해야만 설문에 접근할 수 있습니다. - `.env` 파일에서 `ACCESS_KEY`를 설정하면 기본값을 덮어씁니다. -### 3. 구글 드라이브 API 설정 +### 3. 구글 드라이브 API 설정 (선택사항) 1. [Google Cloud Console](https://console.cloud.google.com/)에서 프로젝트 생성 2. Google Drive API 활성화 @@ -46,17 +57,7 @@ GOOGLE_DRIVE_FOLDER_ID=your-google-drive-folder-id 4. `credentials.json` 파일을 프로젝트 루트에 저장 5. 구글 드라이브에 업로드할 폴더를 생성하고 폴더 ID를 `.env`에 설정 -### 4. 워드 템플릿 준비 (선택사항) - -`word_templates/` 디렉토리에 각 이단별 템플릿 파일을 준비할 수 있습니다: -- `신천지_template.docx` -- `구원파_template.docx` -- `하나님의교회_template.docx` -- `통일교_template.docx` -- `기타_template.docx` -- `default_template.docx` (기본 템플릿) - -템플릿 파일이 없으면 자동으로 기본 템플릿이 생성됩니다. +**참고:** 구글 드라이브 설정이 없어도 서비스는 정상 작동하며, 로컬에 파일이 저장됩니다. ## 실행 방법 @@ -71,13 +72,15 @@ python app.py ``` . ├── app.py # Flask 메인 애플리케이션 -├── config.py # 설정 파일 +├── config.py # 설정 파일 (교구 목록, 이단 목록, 이단별 문항) ├── requirements.txt # Python 의존성 ├── .env # 환경 변수 (생성 필요) -├── credentials.json # 구글 드라이브 인증 파일 (생성 필요) -├── token.json # 구글 드라이브 토큰 (자동 생성) +├── credentials.json # 구글 드라이브 인증 파일 (선택사항) +├── token.json # 구글 드라이브 토큰 (자동 생성, 선택사항) ├── templates/ # HTML 템플릿 │ ├── base.html +│ ├── auth.html +│ ├── index.html │ ├── step1.html │ ├── step2.html │ ├── step3.html @@ -87,13 +90,59 @@ python app.py ├── static/ # 정적 파일 │ ├── style.css │ └── script.js -├── word_templates/ # 워드 템플릿 파일 +├── word_templates/ # 워드 템플릿 파일 (선택사항) ├── output/ # 생성된 문서 저장 폴더 (자동 생성) └── utils/ # 유틸리티 모듈 ├── word_processor.py └── google_drive.py ``` +## 워드 문서 구조 + +생성되는 워드 문서는 다음과 같은 구조를 가집니다: + +1. **문서 상단** + - 제목: "이단 탈퇴자 교리점검표" + - 기본 정보: 이름 | 교구 | 이단교단 + +2. **별첨 목록** + - 별첨1: 감리교 신앙고백서 확인점검 + - 별첨2: 이단 일반 점검 + - 별첨3: 이단 상세 점검 + - 별첨4: 간증문 + +3. **[별첨1] 감리교 신앙고백서 확인점검** + - 표 형식 (문항 | 응답) + - 8개 문항 + +4. **[별첨2] 이단 일반 점검** + - 표 형식 (문항 | 응답) + - 17개 문항 + - 기타의견 (7번 문항 답변 포함) + +5. **[별첨3] 이단 상세 점검** (기타 선택 시 생략) + - 표 형식 (문항 | 응답) + - 선택한 이단에 따라 다른 문항 + - 기타의견 (일부 문항 답변 포함) + +6. **[별첨4] 간증문** + - 간증문 내용 + +## 지원하는 이단 + +- 신천지 (17개 문항) +- 하나님의교회 (9개 문항) +- 다락방 (12개 문항) +- 구원파 (박옥수,이요한,유병언) (13개 문항) +- JMS (14개 문항, 3번은 기타의견란) +- 성락교회 (베뢰아) (10개 문항, 8번은 기타의견란) +- 통일교 (8개 문항) +- 몰몬교 (12개 문항) +- 안식교 (12개 문항) +- 사랑하는교회 (8개 문항) +- 예수중심교회 (이초석) (8개 문항) +- 기타 (위 선택지에 없을 경우) - 직접 입력, 상세 점검 생략 + ## 리눅스 서버 배포 ### 1. Gunicorn 설치 @@ -149,6 +198,22 @@ server { } ``` +## 주요 기능 상세 + +### 세션 관리 +- 각 단계의 입력 내용은 세션에 저장됩니다 +- 뒤로가기 시 이전 입력 내용이 자동으로 채워집니다 +- 제출 완료 후 complete 페이지에서 로그아웃 버튼으로 세션 삭제 + +### 파일 관리 +- 구글 드라이브 업로드 성공 시: 로컬 파일 자동 삭제 +- 구글 드라이브 업로드 실패 시: 로컬 파일 유지 (`output/` 폴더) +- 구글 드라이브 미설정 시: 로컬 파일 유지 + +### 검증 기능 +- 기타의견란 필수 문항 검증 (step3의 7번, step4의 일부 문항) +- 클라이언트 및 서버 양쪽에서 검증 + ## 주의사항 - 프로덕션 환경에서는 `SECRET_KEY`와 `ACCESS_KEY`를 안전하게 설정하세요 @@ -156,15 +221,23 @@ server { - 구글 드라이브 API 인증 정보는 절대 공개하지 마세요 - `output/` 디렉토리의 파일은 정기적으로 정리하세요 - HTTPS를 사용하여 데이터 보안을 강화하세요 +- 서버 환경에서는 구글 드라이브 인증을 로컬에서 먼저 완료하여 `token.json`을 생성해야 합니다 ## 인증키 관리 - 기본 인증키: `Kx9mP2vQ7nR4tY8wZ3bC6hJ1fL5dN0sA8uE2iM7o` - 인증키는 `.env` 파일의 `ACCESS_KEY`로 변경할 수 있습니다 -- 사용자는 서비스 접속 시 인증 페이지에서 인증키를 입력해야 합니다 -- 인증 후 세션에 저장되며, 로그아웃 시 인증이 해제됩니다 +- 사용자는 서비스 접속 시 인증 페이지(`/auth`)에서 인증키를 입력해야 합니다 +- 인증 후 세션에 저장되며, 로그아웃 시 세션이 삭제됩니다 + +## 로깅 + +서비스는 상세한 로그를 출력합니다: +- 구글 드라이브 초기화 상태 +- 구글 드라이브 업로드 시도/성공/실패 +- 파일 삭제 상태 +- 세션 관리 상태 ## 라이선스 이 프로젝트는 기독교대한감리회를 위한 내부 사용 목적으로 제작되었습니다. - diff --git a/app.py b/app.py index 7c986c6..a56f38e 100644 --- a/app.py +++ b/app.py @@ -222,7 +222,6 @@ def step5(): output_path = word_processor.generate_document(all_data, cult_name, cult_questions) # 구글 드라이브 업로드 - upload_success = False if drive_uploader and app.config['GOOGLE_DRIVE_FOLDER_ID']: upload_filename = f"교리점검표_{all_data['basic_info'].get('name', '무명')}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.docx" logger.info("구글 드라이브 업로드 시도 | file=%s, folder=%s", upload_filename, app.config['GOOGLE_DRIVE_FOLDER_ID']) @@ -233,7 +232,6 @@ def step5(): app.config['GOOGLE_DRIVE_FOLDER_ID'] ) logger.info("구글 드라이브 업로드 성공 | file_id=%s", file_id) - upload_success = True # 업로드 성공 시 로컬 파일 삭제 try: os.remove(output_path) @@ -269,8 +267,6 @@ def step5(): 'success': False, 'message': f'오류가 발생했습니다: {str(e)}' }), 500 - - return render_template('step5.html') @app.route('/complete') @require_auth diff --git a/utils/word_processor.py b/utils/word_processor.py index 370238d..0766a90 100644 --- a/utils/word_processor.py +++ b/utils/word_processor.py @@ -1,8 +1,6 @@ from docx import Document -from docx.shared import Pt, RGBColor +from docx.shared import Pt from docx.enum.text import WD_ALIGN_PARAGRAPH -from docx.oxml.ns import qn -from docx.oxml import OxmlElement import os from datetime import datetime