File size: 5,615 Bytes
352a4b6
 
6ae096f
352a4b6
 
6ae096f
 
352a4b6
 
 
6ae096f
352a4b6
 
 
6ae096f
 
 
352a4b6
 
6ae096f
352a4b6
 
 
 
 
 
 
6ae096f
352a4b6
 
 
6ae096f
352a4b6
 
 
 
6ae096f
 
352a4b6
6ae096f
352a4b6
6ae096f
352a4b6
 
6ae096f
352a4b6
 
6ae096f
352a4b6
 
 
 
6ae096f
 
 
352a4b6
 
 
6ae096f
 
352a4b6
6ae096f
352a4b6
6ae096f
 
 
352a4b6
6ae096f
 
352a4b6
 
 
6ae096f
 
352a4b6
6ae096f
352a4b6
 
 
6ae096f
352a4b6
 
 
6ae096f
352a4b6
 
6ae096f
352a4b6
6ae096f
352a4b6
6ae096f
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import os
from pathlib import Path
import csv # CSV ๋ชจ๋“ˆ ์ž„ํฌํŠธ
import logging

# --- ์„ค์ • ---
# ๊ธฐ๋ณธ ๋กœ๊น… ์„ค์ • (์„ ํƒ์‚ฌํ•ญ, ํ•„์š”์— ๋”ฐ๋ผ ์กฐ์ •)
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# API ์„ค์ •
HF_TOKEN = os.environ.get("HF_TOKEN", None)
MEDGEMMA_ENDPOINT_URL = os.environ.get("MEDGEMMA_ENDPOINT_URL", None)

# --- pathlib์„ ์‚ฌ์šฉํ•œ ๊ฒฝ๋กœ ์„ค์ • ---
# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฐ์ •
BASE_DIR = Path(__file__).parent.resolve() # ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์œ„ํ•ด resolve() ์‚ฌ์šฉ
STATIC_DIR = BASE_DIR / 'static'

# --- CSV์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ณด๊ณ ์„œ/์ด๋ฏธ์ง€ ์Œ ๋กœ๋“œ ---
AVAILABLE_REPORTS = []
MANIFEST_CSV_PATH = STATIC_DIR / 'reports_manifest.csv'

if MANIFEST_CSV_PATH.is_file():
    try:
        with open(MANIFEST_CSV_PATH, mode='r', encoding='utf-8') as csvfile:
            reader = csv.DictReader(csvfile)
            # ์˜ˆ์ƒ๋˜๋Š” CSV ํ—ค๋”: 'image_type', 'case_display_name', 'image_path', 'report_path'
            required_headers = {'case_display_name', 'image_path', 'report_path'}
            if not required_headers.issubset(reader.fieldnames):
                logger.error(
                    f"CSV ํŒŒ์ผ {MANIFEST_CSV_PATH}์— ๋‹ค์Œ ํ•„์ˆ˜ ํ—ค๋”๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: {required_headers - set(reader.fieldnames)}"
                )
            else:
                for row in reader:
                    case_name = row['case_display_name']
                    image_path_from_csv = row['image_path'] # ์˜ˆ: static/images/report1.jpg
                    report_path_from_csv = row['report_path'] # ์˜ˆ: static/reports/report1.txt ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด

                    # image_path_from_csv ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (๋น„์–ด์žˆ์œผ๋ฉด ์•ˆ ๋จ)
                    if not image_path_from_csv:
                        logger.warning(f"์ผ€์ด์Šค '{case_name}'์˜ CSV์—์„œ image_path๊ฐ€ ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•ญ๋ชฉ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.")
                        continue

                    # ์ด๋ฏธ์ง€ ํŒŒ์ผ ๊ฒ€์ฆ์„ ์œ„ํ•œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ๊ตฌ์„ฑ (CSV์˜ ๊ฒฝ๋กœ๋Š” BASE_DIR ๊ธฐ์ค€ ์ƒ๋Œ€ ๊ฒฝ๋กœ)
                    abs_image_path_to_check = BASE_DIR / image_path_from_csv
                    if not abs_image_path_to_check.is_file():
                        logger.warning(f"์ผ€์ด์Šค '{case_name}'์˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ '{abs_image_path_to_check}'์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ํ•ญ๋ชฉ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.")
                        continue

                    image_file_for_config = image_path_from_csv

                    report_file_for_config = "" # ๋ณด๊ณ ์„œ๊ฐ€ ์—†๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ ๋นˆ ๋ฌธ์ž์—ด
                    if report_path_from_csv: # ๋ณด๊ณ ์„œ ๊ฒฝ๋กœ๋Š” ์„ ํƒ์‚ฌํ•ญ
                        # ๋ณด๊ณ ์„œ ํŒŒ์ผ ๊ฒ€์ฆ์„ ์œ„ํ•œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ๊ตฌ์„ฑ (CSV์˜ ๊ฒฝ๋กœ๋Š” BASE_DIR ๊ธฐ์ค€ ์ƒ๋Œ€ ๊ฒฝ๋กœ)
                        abs_report_path_to_check = BASE_DIR / report_path_from_csv
                        if not abs_report_path_to_check.is_file():
                            logger.warning(
                                f"์ผ€์ด์Šค '{case_name}'์— ์ง€์ •๋œ ๋ณด๊ณ ์„œ ํŒŒ์ผ '{abs_report_path_to_check}'์„(๋ฅผ) ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. "
                                f"์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๋ณด๊ณ ์„œ ํŒŒ์ผ ์—†์ด ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค."
                            )
                            # report_file_for_config๋Š” ""๋กœ ์œ ์ง€
                        else:
                            # ํŒŒ์ผ (BASE_DIR / report_path_from_csv)์ด ์กด์žฌํ•จ.
                            # ์ด์ œ report_path_from_csv ๋ฌธ์ž์—ด ์ž์ฒด๊ฐ€ "static/"์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ
                            # CSV ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ฐ€์ •์— ๋”ฐ๋ผ.
                            if report_path_from_csv.startswith('static/') or report_path_from_csv.startswith('static\\'):
                                # ๊ฒฝ๋กœ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹(static/์œผ๋กœ ์‹œ์ž‘)์ด๊ณ  ํŒŒ์ผ์ด ์กด์žฌํ•จ.
                                # ๊ฒฝ๋กœ๋ฅผ ๊ทธ๋Œ€๋กœ ์ €์žฅ (์˜ˆ: "static/reports/report1.txt").
                                report_file_for_config = report_path_from_csv
                            else:
                                logger.warning(
                                    f"CSV์˜ ์ผ€์ด์Šค '{case_name}'์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ ๊ฒฝ๋กœ '{report_path_from_csv}'๊ฐ€ "
                                    f"์ž˜๋ชป๋œ ํ˜•์‹์ž…๋‹ˆ๋‹ค ('static/'์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Œ). ๋ณด๊ณ ์„œ ๊ฒฝ๋กœ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค."
                                )
                                # report_file_for_config๋Š” ""๋กœ ์œ ์ง€
                    AVAILABLE_REPORTS.append({
                        "name": case_name,
                        "image_file": image_file_for_config, # static/images/report1.jpg
                        "report_file": report_file_for_config, # static/reports/report1.txt ๋˜๋Š” ""
                        "image_type": row['image_type']
                    })
        AVAILABLE_REPORTS.sort(key=lambda x: x['name'])
        logger.info(f"CSV์—์„œ {len(AVAILABLE_REPORTS)}๊ฐœ์˜ ๋ณด๊ณ ์„œ/์ด๋ฏธ์ง€ ์Œ์„ ๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค.")

    except Exception as e:
        logger.error(f"CSV ํŒŒ์ผ {MANIFEST_CSV_PATH} ์ฝ๊ธฐ ๋˜๋Š” ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}", exc_info=True)
else:
    logger.warning(f"{MANIFEST_CSV_PATH}์—์„œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ CSV ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. AVAILABLE_REPORTS๊ฐ€ ๋น„์–ด์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.")

# --- ์„ ํƒ์‚ฌํ•ญ: ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๋ณด๊ณ ์„œ ์ •์˜ ---
DEFAULT_REPORT_INFO = AVAILABLE_REPORTS[0] if AVAILABLE_REPORTS else None