Spaces:
Sleeping
Sleeping
File size: 6,092 Bytes
309c78e d270452 2f705b4 d270452 309c78e 653c3a3 309c78e 2f705b4 309c78e 653c3a3 309c78e e9e2b32 309c78e e9e2b32 309c78e e65370d 309c78e d270452 309c78e e65370d 309c78e fc8f628 309c78e e9e2b32 309c78e |
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 |
import uuid
import json
import gradio as gr
from datetime import datetime
import urllib.parse
import pytz
class SubmissionService:
def __init__(self, gcs_service):
self.gcs_service = gcs_service
self.bucket_name = "ai_assignment_submission"
def create_submission_id(self):
while True:
submission_id = str(uuid.uuid4())
file_name = f"submissions/{submission_id}.json"
if not self.gcs_service.check_file_exists(self.bucket_name, file_name):
return submission_id
def submit_assignment(self, assignment_id, student_id, student_name, student_email, submission_content, file_name=None, bucket_name=None):
submission_id = self.create_submission_id()
timestamp_now = datetime.now(pytz.utc).astimezone(pytz.timezone('Asia/Taipei')).strftime("%Y-%m-%d %H:%M:%S")
submission_data = {
"file_name": file_name,
"bucket_name": bucket_name,
"content": submission_content
}
submission_data = {
"submission_id": submission_id,
"assignment_id": assignment_id,
"student_id": student_id,
"student_email": student_email,
"student_name": student_name,
"submission_data": submission_data,
"timestamp": timestamp_now
}
self.save_submission_to_gcs(submission_data)
self.save_user_submissions_to_gcs(student_id, submission_data)
self.update_assignment_submission_ids(assignment_id, submission_id)
return f"作業已收到,學生ID:{student_id}"
def update_assignment_submission_ids(self, assignment_id, submission_id):
try:
assignment_data = self.get_assignment_data(assignment_id)
if assignment_data:
if "submission_ids" not in assignment_data:
assignment_data["submission_ids"] = []
assignment_data["submission_ids"].append(submission_id)
file_name = f"assignments/{assignment_id}.json"
self.gcs_service.upload_json_string(self.bucket_name, file_name, json.dumps(assignment_data))
except Exception as e:
print(f"更新作業提交ID時出錯:{e}")
def get_assignment_data(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 None
return assignment_data
def save_submission_to_gcs(self, submission_data):
file_name = f"submissions/{submission_data['submission_id']}.json"
self.gcs_service.upload_json_string(self.bucket_name, file_name, json.dumps(submission_data))
def save_user_submissions_to_gcs(self, student_id, submission_data):
encoded_student_id_url = urllib.parse.quote(student_id, safe='')
try:
user_submissions_json = self.gcs_service.download_as_string(self.bucket_name, f"users/{encoded_student_id_url}/submissions.json")
user_submissions = json.loads(user_submissions_json)
except Exception as e:
print(f"Error: {e}")
user_submissions = {}
submission_id = submission_data['submission_id']
assignment_id = submission_data['assignment_id']
assignment_data = self.get_assignment_data(assignment_id)
user_submissions[submission_id] = {
"assignment_id": submission_data['assignment_id'],
"assignment_name": assignment_data["metadata"]["topic"],
"assignment_type": assignment_data["assignment_type"],
"timestamp": submission_data['timestamp'],
}
self.gcs_service.upload_json_string(self.bucket_name, f"users/{encoded_student_id_url}/submissions.json", json.dumps(user_submissions))
def get_submission_from_gcs(self, submission_id):
try:
file_name = f"submissions/{submission_id}.json"
submission_json = self.gcs_service.download_as_string(self.bucket_name, file_name)
submission_data = json.loads(submission_json)
except Exception as e:
print(f"Error: {e}")
return None
return submission_data
def list_submissions(self):
# 列出所有提交的作业
try:
prefix = "submissions/"
blobs = self.gcs_service.list_files(self.bucket_name, prefix)
submission_ids = [blob.name.split("/")[-1].replace(".json", "") for blob in blobs]
return submission_ids
except Exception as e:
print(f"Error: {e}")
return []
def get_student_submissions_list(self, student_id):
try:
encoded_student_id_url = urllib.parse.quote(student_id, safe='')
user_submissions_json = self.gcs_service.download_as_string(self.bucket_name, f"users/{encoded_student_id_url}/submissions.json")
user_submissions = json.loads(user_submissions_json)
except Exception as e:
print(f"Error: {e}")
return {}
return user_submissions
def update_submission_list(self, student_id):
choices = []
user_submissions = self.get_student_submissions_list(student_id)
for submission_id, submission in user_submissions.items():
topic = submission.get("assignment_name", "未命名作业")
choice = (topic, submission_id)
choices.append(choice)
return gr.update(choices=choices)
def get_student_submissions(self, student_id):
submission_ids = self.list_submissions()
for submission_id in submission_ids:
submission_data = self.get_submission_from_gcs(submission_id)
if submission_data and submission_data.get("student_id") == student_id:
return submission_data["submission"]
return "未找到學生提交的作業"
|