Spaces:
Sleeping
Sleeping
from datetime import datetime | |
import json | |
import os | |
import pytz | |
import traceback | |
class UserHistoryManager: | |
def __init__(self): | |
"""初始化歷史紀錄管理器""" | |
self.history_file = "user_history.json" | |
print(f"Initializing UserHistoryManager with file: {os.path.abspath(self.history_file)}") | |
self._init_file() | |
# def _init_file(self): | |
# """初始化JSON檔案""" | |
# try: | |
# if not os.path.exists(self.history_file): | |
# print(f"Creating new history file: {self.history_file}") | |
# with open(self.history_file, 'w', encoding='utf-8') as f: | |
# json.dump([], f) | |
# else: | |
# print(f"History file exists: {self.history_file}") | |
# # 驗證檔案內容 | |
# with open(self.history_file, 'r', encoding='utf-8') as f: | |
# data = json.load(f) | |
# print(f"Current history entries: {len(data)}") | |
# except Exception as e: | |
# print(f"Error in _init_file: {str(e)}") | |
# print(traceback.format_exc()) | |
# def save_history(self, user_preferences: dict = None, results: list = None, search_type: str = "criteria", description: str = None) -> bool: | |
# """ | |
# Save search history with proper timestamp handling. | |
# Args: | |
# user_preferences: User's search preferences | |
# results: List of breed recommendations | |
# search_type: Type of search performed | |
# description: Search description if applicable | |
# Returns: | |
# bool: Success status of save operation | |
# """ | |
# try: | |
# # Initialize timezone and current time | |
# taipei_tz = pytz.timezone('Asia/Taipei') | |
# current_time = datetime.now(taipei_tz) | |
# # Create history entry with timestamp | |
# history_entry = { | |
# "timestamp": current_time.strftime("%Y-%m-%d %H:%M:%S"), | |
# "search_type": search_type, | |
# "results": results | |
# } | |
# # Add preferences to history entry if provided | |
# if user_preferences: | |
# history_entry["preferences"] = user_preferences | |
# # Read existing history | |
# with open(self.history_file, 'r', encoding='utf-8') as f: | |
# history = json.load(f) | |
# # Add new entry and maintain history limit | |
# history.append(history_entry) | |
# if len(history) > 20: # Keep last 20 entries | |
# history = history[-20:] | |
# # Save updated history | |
# with open(self.history_file, 'w', encoding='utf-8') as f: | |
# json.dump(history, f, ensure_ascii=False, indent=2) | |
# return True | |
# except Exception as e: | |
# print(f"Error saving history: {str(e)}") | |
# return False | |
def _init_file(self): | |
"""初始化JSON檔案""" | |
try: | |
if not os.path.exists(self.history_file): | |
print(f"Creating new history file: {self.history_file}") | |
with open(self.history_file, 'w', encoding='utf-8') as f: | |
json.dump([], f) | |
else: | |
print(f"History file exists: {self.history_file}") | |
with open(self.history_file, 'r', encoding='utf-8') as f: | |
data = json.load(f) | |
print(f"Current history entries: {len(data)}") | |
except Exception as e: | |
print(f"Error in _init_file: {str(e)}") | |
print(traceback.format_exc()) | |
def save_history(self, user_preferences: dict = None, results: list = None, search_type: str = "criteria", description: str = None) -> bool: | |
""" | |
保存搜尋歷史,確保結果資料被完整保存 | |
Args: | |
user_preferences: 使用者的搜尋偏好設定 | |
results: 品種推薦結果列表 | |
search_type: 搜尋類型 | |
description: 搜尋描述 | |
Returns: | |
bool: 保存是否成功 | |
""" | |
try: | |
# 初始化時區和當前時間 | |
taipei_tz = pytz.timezone('Asia/Taipei') | |
current_time = datetime.now(taipei_tz) | |
# 創建歷史紀錄項目並包含時間戳記 | |
history_entry = { | |
"timestamp": current_time.strftime("%Y-%m-%d %H:%M:%S"), | |
"search_type": search_type | |
} | |
# 確保結果資料的完整性 | |
if results and isinstance(results, list): | |
processed_results = [] | |
for result in results: | |
# 確保每個結果都包含必要的欄位 | |
if isinstance(result, dict): | |
processed_result = { | |
'breed': result.get('breed', 'Unknown'), | |
'overall_score': result.get('overall_score', result.get('final_score', 0)), | |
'rank': result.get('rank', 0) | |
} | |
processed_results.append(processed_result) | |
history_entry["results"] = processed_results | |
# 加入使用者偏好設定(如果有的話) | |
if user_preferences: | |
history_entry["preferences"] = user_preferences | |
# 讀取現有歷史 | |
with open(self.history_file, 'r', encoding='utf-8') as f: | |
history = json.load(f) | |
# 加入新紀錄並保持歷史限制 | |
history.append(history_entry) | |
if len(history) > 20: # 保留最近 20 筆 | |
history = history[-20:] | |
# 儲存更新後的歷史 | |
with open(self.history_file, 'w', encoding='utf-8') as f: | |
json.dump(history, f, ensure_ascii=False, indent=2) | |
print(f"Successfully saved history entry: {history_entry}") | |
return True | |
except Exception as e: | |
print(f"Error saving history: {str(e)}") | |
print(traceback.format_exc()) | |
return False | |
def get_history(self) -> list: | |
"""獲取搜尋歷史""" | |
try: | |
print("Attempting to read history") # Debug | |
with open(self.history_file, 'r', encoding='utf-8') as f: | |
data = json.load(f) | |
print(f"Read {len(data)} history entries") # Debug | |
return data if isinstance(data, list) else [] | |
except Exception as e: | |
print(f"Error reading history: {str(e)}") | |
print(traceback.format_exc()) | |
return [] | |
def clear_all_history(self) -> bool: | |
"""清除所有歷史紀錄""" | |
try: | |
print("Attempting to clear all history") # Debug | |
with open(self.history_file, 'w', encoding='utf-8') as f: | |
json.dump([], f) | |
print("History cleared successfully") # Debug | |
return True | |
except Exception as e: | |
print(f"Error clearing history: {str(e)}") | |
print(traceback.format_exc()) | |
return False | |