import uuid import json import gradio as gr from datetime import datetime import urllib.parse 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 批改": 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().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(student_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)