File size: 4,591 Bytes
309c78e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e9e2b32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
309c78e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e9e2b32
 
 
 
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
import uuid
import json
import gradio as gr
from datetime import datetime


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, url, attach_materials, submission_deadline):
        if assignment_type == "中文寫作 AI 批改":
            metadata = {
                "assignment_type": assignment_type,
                "grade": grade,
                "topic": topic,
                "introduction": introduction,
                "description": description,
                "url": url,
                "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")
        new_assignment = {
            "assignment_id": assignment_id,
            "assigner_data": user_data,
            "assignment_type": assignment_type,
            "metadata": metadata,
            "submission_ids": [],
            "timestamp": timestamp_now
        }
        self.save_assignment_to_gcs(new_assignment)
        self.save_user_assignment_to_gcs(user_data, assignment_id)
        return assignment_id

    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"]
        }
        self.gcs_service.upload_json_string(self.bucket_name, f"users/{user_id}/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:
            user_assignments_json = self.gcs_service.download_as_string(self.bucket_name, f"users/{user_id}/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)