youngtsai commited on
Commit
309c78e
·
1 Parent(s): 330a072

class AssignmentService:

Browse files
Files changed (2) hide show
  1. assignment_service.py +77 -0
  2. submission_service.py +120 -0
assignment_service.py ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import uuid
2
+ import json
3
+ import datetime
4
+ import gradio as gr
5
+ from datetime import datetime
6
+
7
+
8
+ class AssignmentService:
9
+ def __init__(self, gcs_service):
10
+ self.bucket_name = "ai_assignment_submission"
11
+ self.gcs_service = gcs_service
12
+
13
+ def create_assignment_id(self):
14
+ while True:
15
+ assignment_id = "assign_" + str(uuid.uuid4())
16
+ file_name = f"assignments/{assignment_id}.json"
17
+ if not self.gcs_service.check_file_exists(self.bucket_name, file_name):
18
+ return assignment_id
19
+
20
+ def create_assignment(self, user_data, assignment_type, metadata):
21
+ assignment_id = self.create_assignment_id()
22
+ timestamp_now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
23
+ new_assignment = {
24
+ "assignment_id": assignment_id,
25
+ "assigner_data": user_data,
26
+ "assignment_type": assignment_type,
27
+ "metadata": metadata,
28
+ "submission_ids": [],
29
+ "timestamp": timestamp_now
30
+ }
31
+ self.save_assignment_to_gcs(new_assignment)
32
+ self.save_user_assignment_to_gcs(user_data, assignment_id)
33
+ return assignment_id
34
+
35
+ def save_assignment_to_gcs(self, assignment):
36
+ file_name = f"assignments/{assignment['assignment_id']}.json"
37
+ self.gcs_service.upload_json_string(self.bucket_name, file_name, json.dumps(assignment))
38
+
39
+ def save_user_assignment_to_gcs(self, user_id, assignment_id):
40
+ user_assignments = self.get_user_assignments(user_id)
41
+ assignment_data = self.get_assignment(assignment_id)
42
+ user_assignments[assignment_id] = {
43
+ "assignment_name": assignment_data["metadata"]["topic"],
44
+ "assignment_type": assignment_data["assignment_type"],
45
+ "timestamp": assignment_data["timestamp"]
46
+ }
47
+ self.gcs_service.upload_json_string(self.bucket_name, f"users/{user_id}/assignments.json", json.dumps(user_assignments))
48
+
49
+ def get_assignment(self, assignment_id):
50
+ try:
51
+ file_name = f"assignments/{assignment_id}.json"
52
+ assignment_json = self.gcs_service.download_as_string(self.bucket_name, file_name)
53
+ assignment_data = json.loads(assignment_json)
54
+ except Exception as e:
55
+ print(f"Error: {e}")
56
+ return "無效的作業 ID"
57
+ return assignment_data
58
+
59
+ def get_user_assignments(self, user_id):
60
+ try:
61
+ user_assignments_json = self.gcs_service.download_as_string(self.bucket_name, f"users/{user_id}/assignments.json")
62
+ user_assignments = json.loads(user_assignments_json)
63
+ except Exception as e:
64
+ print(f"Error: {e}")
65
+ user_assignments = {}
66
+ return user_assignments
67
+
68
+ def update_assignment_list(self, assigner_data):
69
+ choices = []
70
+ user_assignments = self.get_user_assignments(assigner_data)
71
+ for assignment_id in user_assignments.keys():
72
+ assignment_data = self.get_assignment(assignment_id)
73
+ metadata = assignment_data.get("metadata", {})
74
+ topic = metadata.get("topic", "未命名作业")
75
+ choice = (topic, assignment_id)
76
+ choices.append(choice)
77
+ return gr.update(choices=choices)
submission_service.py ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import uuid
2
+ import json
3
+ import datetime
4
+ import gradio as gr
5
+ from datetime import datetime
6
+
7
+
8
+ class SubmissionService:
9
+ def __init__(self, gcs_service):
10
+ self.gcs_service = gcs_service
11
+ self.bucket_name = "ai_assignment_submission"
12
+
13
+ def create_submission_id(self):
14
+ while True:
15
+ submission_id = str(uuid.uuid4())
16
+ file_name = f"submissions/{submission_id}.json"
17
+ if not self.gcs_service.check_file_exists(self.bucket_name, file_name):
18
+ return submission_id
19
+
20
+ def submit_assignment(self, assignment_id, student_id, student_name, submission_content, file_name=None, bucket_name=None):
21
+ submission_id = self.create_submission_id()
22
+ timestamp_now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
23
+ submission_data = {
24
+ "file_name": file_name,
25
+ "bucket_name": bucket_name,
26
+ "content": submission_content
27
+ }
28
+ submission_data = {
29
+ "submission_id": submission_id,
30
+ "assignment_id": assignment_id,
31
+ "student_id": student_id,
32
+ "student_name": student_name,
33
+ "submission_data": submission_data,
34
+ "timestamp": timestamp_now
35
+ }
36
+
37
+ self.save_submission_to_gcs(submission_data)
38
+ self.save_user_submissions_to_gcs(student_id, submission_data)
39
+
40
+ return f"作業已收到,學生ID:{student_id}"
41
+
42
+ def get_assignment_data(self, assignment_id):
43
+ try:
44
+ file_name = f"assignments/{assignment_id}.json"
45
+ assignment_json = self.gcs_service.download_as_string(self.bucket_name, file_name)
46
+ assignment_data = json.loads(assignment_json)
47
+ except Exception as e:
48
+ print(f"Error: {e}")
49
+ return None
50
+ return assignment_data
51
+
52
+ def save_submission_to_gcs(self, submission_data):
53
+ file_name = f"submissions/{submission_data['submission_id']}.json"
54
+ self.gcs_service.upload_json_string(self.bucket_name, file_name, json.dumps(submission_data))
55
+
56
+ def save_user_submissions_to_gcs(self, student_id, submission_data):
57
+ try:
58
+ user_submissions_json = self.gcs_service.download_as_string(self.bucket_name, f"users/{student_id}/submissions.json")
59
+ user_submissions = json.loads(user_submissions_json)
60
+ except Exception as e:
61
+ print(f"Error: {e}")
62
+ user_submissions = {}
63
+
64
+ submission_id = submission_data['submission_id']
65
+ assignment_id = submission_data['assignment_id']
66
+ assignment_data = self.get_assignment_data(assignment_id)
67
+ user_submissions[submission_id] = {
68
+ "assignment_id": submission_data['assignment_id'],
69
+ "assignment_name": assignment_data["metadata"]["topic"],
70
+ "assignment_type": assignment_data["assignment_type"],
71
+ "timestamp": submission_data['timestamp'],
72
+ }
73
+ self.gcs_service.upload_json_string(self.bucket_name, f"users/{student_id}/submissions.json", json.dumps(user_submissions))
74
+
75
+ def get_submission_from_gcs(self, submission_id):
76
+ try:
77
+ file_name = f"submissions/{submission_id}.json"
78
+ submission_json = self.gcs_service.download_as_string(self.bucket_name, file_name)
79
+ submission_data = json.loads(submission_json)
80
+ except Exception as e:
81
+ print(f"Error: {e}")
82
+ return None
83
+ return submission_data
84
+
85
+ def list_submissions(self):
86
+ # 列出所有提交的作业
87
+ try:
88
+ prefix = "submissions/"
89
+ blobs = self.gcs_service.list_files(self.bucket_name, prefix)
90
+ submission_ids = [blob.name.split("/")[-1].replace(".json", "") for blob in blobs]
91
+ return submission_ids
92
+ except Exception as e:
93
+ print(f"Error: {e}")
94
+ return []
95
+
96
+ def get_student_submissions_list(self, student_id):
97
+ try:
98
+ user_submissions_json = self.gcs_service.download_as_string(self.bucket_name, f"users/{student_id}/submissions.json")
99
+ user_submissions = json.loads(user_submissions_json)
100
+ except Exception as e:
101
+ print(f"Error: {e}")
102
+ return {}
103
+ return user_submissions
104
+
105
+ def update_submission_list(self, student_id):
106
+ choices = []
107
+ user_submissions = self.get_student_submissions_list(student_id)
108
+ for submission_id, submission in user_submissions.items():
109
+ topic = submission.get("assignment_name", "未命名作业")
110
+ choice = (topic, submission_id)
111
+ choices.append(choice)
112
+ return gr.update(choices=choices)
113
+
114
+ def get_student_submission(self, student_id):
115
+ submission_ids = self.list_submissions()
116
+ for submission_id in submission_ids:
117
+ submission_data = self.get_submission_from_gcs(submission_id)
118
+ if submission_data and submission_data.get("student_id") == student_id:
119
+ return submission_data["submission"]
120
+ return "未找到學生提交的作業"