Spaces:
Sleeping
Sleeping
File size: 5,913 Bytes
309c78e d270452 2f705b4 309c78e e9e2b32 96c172b f1b30c1 e9e2b32 309c78e 2f705b4 96c172b e751703 96c172b 309c78e 96c172b 309c78e 96c172b 309c78e 4d3170d d270452 309c78e e9e2b32 309c78e d270452 309c78e e9e2b32 309c78e e9e2b32 309c78e e9e2b32 309c78e e9e2b32 |
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 |
import uuid
import json
import gradio as gr
from datetime import datetime
import urllib.parse
import pytz
class AssignmentService:
def __init__(self, gcs_service):
self.bucket_name = "ai_assignment_submission"
self.gcs_service = gcs_service
def create_assignment_id(self):
while True:
assignment_id = "assign_" + str(uuid.uuid4())
file_name = f"assignments/{assignment_id}.json"
if not self.gcs_service.check_file_exists(self.bucket_name, file_name):
return assignment_id
def create_assignment_metadata(self, assignment_type, grade, topic, introduction, description, attach_materials, submission_deadline):
# if assignment_type == ["中文寫作 AI 批改", "英文寫作 AI 批改"]:
metadata = {
"assignment_type": assignment_type,
"grade": grade,
"topic": topic,
"introduction": introduction,
"description": description,
"attach_materials": attach_materials,
"submission_deadline": submission_deadline
}
return metadata
def create_assignment(self, user_data, assignment_type, metadata):
assignment_id = self.create_assignment_id()
timestamp_now = datetime.now(pytz.utc).astimezone(pytz.timezone('Asia/Taipei')).strftime("%Y-%m-%d %H:%M:%S")
host_url = "https://www.junyiacademy.org/event/jutor_write_2024/?__theme=light"
language_mapping = {
"中文寫作 AI 批改": "chinese",
"英文寫作 AI 批改": "english"
}
language = language_mapping.get(assignment_type, "")
assignment_url = f"{host_url}&language={language}&assignment={assignment_id}"
new_assignment = {
"assignment_id": assignment_id,
"assigner_data": user_data,
"assignment_type": assignment_type,
"metadata": metadata,
"assignment_url": assignment_url,
"submission_ids": [],
"timestamp": timestamp_now
}
self.save_assignment_to_gcs(new_assignment)
self.save_user_assignment_to_gcs(user_data, assignment_id)
return new_assignment
def get_assignment_url(self, assignment_id):
assignment_data = self.get_assignment(assignment_id)
if isinstance(assignment_data, str):
print(f"错误:无法获取作业数据。返回的数据:{assignment_data}")
return None
assignment_url = assignment_data.get("assignment_url")
if not assignment_url:
print(f"警告:作业 {assignment_id} 没有 URL")
return None
return assignment_url
def update_assignment(self, assignment_id, assignment_data):
self.gcs_service.upload_json_string(self.bucket_name, f"assignments/{assignment_id}.json", json.dumps(assignment_data))
def save_assignment_to_gcs(self, assignment):
file_name = f"assignments/{assignment['assignment_id']}.json"
self.gcs_service.upload_json_string(self.bucket_name, file_name, json.dumps(assignment))
def save_user_assignment_to_gcs(self, user_id, assignment_id):
user_assignments = self.get_user_assignments(user_id)
assignment_data = self.get_assignment(assignment_id)
user_assignments[assignment_id] = {
"assignment_name": assignment_data["metadata"]["topic"],
"assignment_type": assignment_data["assignment_type"],
"timestamp": assignment_data["timestamp"]
}
encoded_user_id_url = urllib.parse.quote(user_id, safe='')
self.gcs_service.upload_json_string(self.bucket_name, f"users/{encoded_user_id_url}/assignments.json", json.dumps(user_assignments))
def get_assignment(self, assignment_id):
try:
file_name = f"assignments/{assignment_id}.json"
assignment_json = self.gcs_service.download_as_string(self.bucket_name, file_name)
assignment_data = json.loads(assignment_json)
except Exception as e:
print(f"Error: {e}")
return "無效的作業 ID"
return assignment_data
def get_assignment_submissions(self, assignment_id):
assignment_data = self.get_assignment(assignment_id)
return assignment_data["submission_ids"]
def get_user_assignments(self, user_id):
try:
encoded_user_id_url = urllib.parse.quote(user_id, safe='')
user_assignments_json = self.gcs_service.download_as_string(self.bucket_name, f"users/{encoded_user_id_url}/assignments.json")
user_assignments = json.loads(user_assignments_json)
except Exception as e:
print(f"Error: {e}")
user_assignments = {}
return user_assignments
def update_assignment_list(self, assigner_data):
choices = []
user_assignments = self.get_user_assignments(assigner_data)
for assignment_id, assignment_info in user_assignments.items():
assignment_data = self.get_assignment(assignment_id)
metadata = assignment_data.get("metadata", {})
topic = metadata.get("topic", "未命名作業")
assignment_type = assignment_data.get("assignment_type", "未知類型")
timestamp = assignment_data.get("timestamp", "未知日期")
# 格式化日期
date = datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S").strftime("%Y-%m-%d")
# 創建格式化的選項
formatted_choice = f"{date}|{assignment_type}|{topic}"
choice = (formatted_choice, assignment_id)
choices.append(choice)
# 按日期降序排序
choices.sort(key=lambda x: x[0].split("|")[0], reverse=True)
return gr.update(choices=choices)
|