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 "未找到學生提交的作業"