Spaces:
Sleeping
Sleeping
File size: 6,848 Bytes
5957456 6cc56bb 5957456 6cc56bb 5957456 653c3a3 5957456 493d6ff 5957456 493d6ff 5957456 493d6ff 5957456 653c3a3 5957456 493d6ff 5957456 653c3a3 5957456 653c3a3 5957456 653c3a3 5957456 653c3a3 5957456 |
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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
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"
|