Spaces:
Sleeping
Sleeping
import json | |
from datetime import datetime, timezone | |
import pytz | |
class DashboardService: | |
def __init__(self, assignment_service, submission_service): | |
self.assignment_service = assignment_service | |
self.submission_service = submission_service | |
def get_dashboard_data(self, user_id): | |
assignments = self.assignment_service.get_user_assignments(user_id) | |
dashboard_data = [] | |
for assignment_id, assignment_info in assignments.items(): | |
assignment_data = self.assignment_service.get_assignment(assignment_id) | |
submission_ids = assignment_data.get("submission_ids", []) | |
submission_count = len(submission_ids) | |
dashboard_item = { | |
# "assignment_id": assignment_id, | |
"作業題目": assignment_data["metadata"]["topic"], | |
"類型": assignment_data["assignment_type"], | |
"回傳數量": submission_count, | |
"建立時間": assignment_data["timestamp"], | |
"截止時間": assignment_data["metadata"].get("submission_deadline") | |
} | |
dashboard_data.append(dashboard_item) | |
# 按創建日期降序排序 | |
dashboard_data.sort(key=lambda x: x["建立時間"], reverse=True) | |
return dashboard_data | |
def get_assignment_details(self, assignment_id): | |
assignment_data = self.assignment_service.get_assignment(assignment_id) | |
submission_ids = assignment_data.get("submission_ids", []) | |
submissions = [] | |
for submission_id in submission_ids: | |
submission_data = self.submission_service.get_submission_from_gcs(submission_id) | |
if submission_data: | |
submissions.append({ | |
"submission_id": submission_id, | |
"student_id": submission_data["student_id"], | |
"student_email": submission_data.get("student_email", "未提供"), | |
"student_name": submission_data["student_name"], | |
"submission_date": submission_data["timestamp"] | |
}) | |
return { | |
"assignment_data": assignment_data, | |
"submissions": submissions | |
} | |
def get_submission_details(self, submission_id): | |
submission_data = self.submission_service.get_submission_from_gcs(submission_id) | |
if not submission_data: | |
return {"error": "找不到提交記錄"} | |
assignment_data = self.assignment_service.get_assignment(submission_data["assignment_id"]) | |
return { | |
"submission_data": submission_data, | |
"assignment_data": assignment_data | |
} | |
def get_all_submissions(self, user_id, user_email, user_nickname): | |
assignments = self.assignment_service.get_user_assignments(user_id) | |
all_submissions = [] | |
for assignment_id, assignment_info in assignments.items(): | |
# 20251016 新增 | |
# 確認 assignment_data 是否包含 "assigner_email" and "assigner_nickname" 欄位 | |
# 如果沒有,且 user_id 是 admin,則給 value = 空值 | |
# 如果不是 admin 則給 value from user_email, user_nickname | |
assignment_data = self.assignment_service.get_assignment(assignment_id) | |
if "assigner_email" not in assignment_data["metadata"] or "assigner_nickname" not in assignment_data["metadata"]: | |
if user_id == "admin": | |
assignment_data["metadata"]["assigner_email"] = f"""查無email - {assignment_data["metadata"]["assigner_data"]["email"]}""" | |
assignment_data["metadata"]["assigner_nickname"] = f"""查無名稱 - {assignment_data["metadata"]["assigner_data"]["nickname"]}""" | |
else: | |
assignment_data["metadata"]["assigner_email"] = user_email | |
assignment_data["metadata"]["assigner_nickname"] = user_nickname | |
self.assignment_service.update_assignment(assignment_id, assignment_data) | |
submission_ids = assignment_data.get("submission_ids", []) | |
for submission_id in submission_ids: | |
submission_data = self.submission_service.get_submission_from_gcs(submission_id) | |
if submission_data: | |
score = self.extract_score(submission_data) | |
all_submissions.append({ | |
"作業名稱": assignment_data["metadata"]["topic"], | |
"作業類型": assignment_data["assignment_type"], | |
# "學生_id": submission_data["student_id"], | |
"學生Email": submission_data.get("student_email", "未提供"), | |
"學生姓名": submission_data["student_name"], | |
"老師Email": assignment_data["metadata"]["assigner_email"], | |
"老師姓名": assignment_data["metadata"]["assigner_nickname"], | |
"繳交日期": submission_data["timestamp"], | |
"分數": score | |
}) | |
all_submissions.sort(key=lambda x: x["繳交日期"], reverse=True) | |
return all_submissions | |
def extract_score(self, submission_data): | |
try: | |
content = submission_data.get("submission_data", {}) | |
if isinstance(content, str): | |
content = json.loads(content) | |
if not isinstance(content, dict): | |
print(f"內容格式不正確:{type(content)}") | |
return "N/A" | |
content = content.get("content", {}) | |
if isinstance(content, str): | |
content = json.loads(content) | |
output_tables = content.get("chinese_full_paragraph_refine_output_table", []) | |
print(f"output_tables: {output_tables}") # 調試輸出 | |
last_score = "N/A" | |
# 只取最後一個「綜合評分」 | |
for table in reversed(output_tables): | |
print(f"檢查 table: {table}") # 調試輸出 | |
if isinstance(table, str): | |
try: | |
table = json.loads(table) | |
except json.JSONDecodeError: | |
continue | |
if isinstance(table, dict) and table.get("架構") == "綜合評分": | |
last_score = table.get("評分", "N/A") | |
print(f"找到最後的評分: {last_score}") # 調試輸出 | |
break | |
return last_score | |
except json.JSONDecodeError as e: | |
print(f"JSON 解析錯誤:{str(e)}") | |
except Exception as e: | |
print(f"提取分數時出錯:{str(e)}") | |
print(f"提交數據:{submission_data}") | |
return "N/A" | |