import gradio as gr
import traceback
from typing import Optional, Dict, List
from history_manager import UserHistoryManager
class SearchHistoryComponent:
def __init__(self):
"""初始化搜索歷史組件"""
self.history_manager = UserHistoryManager()
# def format_history_html(self, history_data: Optional[List[Dict]] = None) -> str:
# try:
# if history_data is None:
# history_data = self.history_manager.get_history()
# if not history_data:
# return """
#
"
# for entry in reversed(history_data):
# timestamp = entry.get('timestamp', 'Unknown time')
# search_type = entry.get('search_type', 'criteria')
# results = entry.get('results', [])
# html += f"""
#
#
# """
# if search_type == "criteria":
# prefs = entry.get('preferences', {})
# html += f"""
#
#
Search Parameters:
#
# - Living Space: {prefs.get('living_space', 'N/A')}
# - Exercise Time: {prefs.get('exercise_time', 'N/A')} minutes
# - Grooming: {prefs.get('grooming_commitment', 'N/A')}
# - Experience: {prefs.get('experience_level', 'N/A')}
# - Children at Home: {"Yes" if prefs.get('has_children') else "No"}
# - Noise Tolerance: {prefs.get('noise_tolerance', 'N/A')}
#
#
# """
# # 結果顯示邏輯
# html += """
#
#
Top 10 Breed Matches:
#
# """
# if results:
# for i, result in enumerate(results[:10], 1):
# breed_name = result.get('breed', 'Unknown breed').replace('_', ' ')
# score = result.get('overall_score', result.get('final_score', 0))
# html += f"""
#
#
# #{i}
# {breed_name}
# {score*100:.1f}%
#
#
# """
# html += """
#
#
#
# """
# html += "
"
# return html
# except Exception as e:
# print(f"Error formatting history: {str(e)}")
# print(traceback.format_exc())
# return f"""
#
# Error formatting history. Please try refreshing the page.
#
Error details: {str(e)}
#
# """
def format_history_html(self, history_data: Optional[List[Dict]] = None) -> str:
try:
if history_data is None:
history_data = self.history_manager.get_history()
if not history_data:
return """
"
# 對歷史記錄進行反轉,最新的顯示在前面
for entry in reversed(history_data):
timestamp = entry.get('timestamp', 'Unknown time')
search_type = entry.get('search_type', 'criteria')
results = entry.get('results', []) # 確保我們有結果資料
# 顯示時間戳記和搜尋類型
html += f"""
"""
# 顯示搜尋參數
if search_type == "criteria":
prefs = entry.get('preferences', {})
html += f"""
Search Parameters:
- Living Space: {prefs.get('living_space', 'N/A')}
- Exercise Time: {prefs.get('exercise_time', 'N/A')} minutes
- Grooming: {prefs.get('grooming_commitment', 'N/A')}
- Experience: {prefs.get('experience_level', 'N/A')}
- Children at Home: {"Yes" if prefs.get('has_children') else "No"}
- Noise Tolerance: {prefs.get('noise_tolerance', 'N/A')}
"""
# 關鍵修改:確保結果部分始終顯示
if results: # 只有在有結果時才顯示結果區域
html += """
Top 10 Breed Matches:
"""
# 顯示每個推薦結果
for i, result in enumerate(results[:10], 1):
breed = result.get('breed', 'Unknown breed')
score = result.get('overall_score', 0) # 改用 overall_score
if isinstance(score, (int, float)): # 確保分數是數字
score = float(score) * 100 # 轉換為百分比
html += f"""
#{i}
{breed.replace('_', ' ')}
{score:.1f}%
"""
html += """
"""
html += "
" # 關閉 history-entry div
html += "
" # 關閉 history-container div
return html
except Exception as e:
print(f"Error formatting history: {str(e)}")
print(traceback.format_exc())
return f"""
Error formatting history. Please try refreshing the page.
Error details: {str(e)}
"""
def clear_history(self) -> str:
"""清除所有搜尋歷史"""
try:
success = self.history_manager.clear_all_history()
print(f"Clear history result: {success}")
return self.format_history_html()
except Exception as e:
print(f"Error in clear_history: {str(e)}")
print(traceback.format_exc())
return "Error clearing history"
def refresh_history(self) -> str:
"""刷新歷史記錄顯示"""
try:
return self.format_history_html()
except Exception as e:
print(f"Error in refresh_history: {str(e)}")
return "Error refreshing history"
def save_search(self, user_preferences: Optional[dict] = None,
results: list = None,
search_type: str = "criteria",
description: str = None) -> bool:
"""保存搜索結果
Args:
user_preferences: 使用者偏好設定 (僅用於criteria搜尋)
results: 推薦結果列表
search_type: 搜尋類型 ("criteria" 或 "description")
description: 使用者輸入的描述 (僅用於description搜尋)
"""
return self.history_manager.save_history(
user_preferences=user_preferences,
results=results,
search_type='criteria',
)
def create_history_component():
"""只創建實例"""
return SearchHistoryComponent()
def create_history_tab(history_component: SearchHistoryComponent):
"""創建歷史紀錄的頁面
Args:
history_component:
"""
with gr.TabItem("Recommendation Search History"):
gr.HTML("""