youngtsai commited on
Commit
5957456
·
1 Parent(s): 7f1b343
Files changed (3) hide show
  1. app.py +3 -1
  2. assignment_ui.py +36 -2
  3. dashboard_service.py +103 -0
app.py CHANGED
@@ -20,6 +20,7 @@ from storage_service import GoogleCloudStorage
20
  from assignment_ui import create_assignment_ui
21
  from assignment_service import AssignmentService
22
  from submission_service import SubmissionService
 
23
 
24
  is_env_local = os.getenv("IS_ENV_LOCAL", "false") == "true"
25
  print(f"is_env_local: {is_env_local}")
@@ -54,6 +55,7 @@ GCS_CLIENT = GCS_SERVICE.client
54
 
55
  _AssignmentService = AssignmentService(GCS_SERVICE)
56
  _SubmissionService = SubmissionService(GCS_SERVICE)
 
57
 
58
  def update_scenario_input(scenario_radio):
59
  return scenario_radio
@@ -3623,7 +3625,7 @@ with gr.Blocks(theme=THEME, css=CSS) as demo:
3623
  with gr.Accordion("💡 提醒", open=True):
3624
  gr.Markdown("Cutor 是你得力的作文批改小幫手,但它不是老師,和你一樣都在學習,偶爾也會出錯。如果你對於 Cutor 給你的建議有疑問,請提出和平台討論喔")
3625
  with gr.Row():
3626
- assignment_interface = create_assignment_ui(user_data, _AssignmentService, _SubmissionService)
3627
 
3628
  demo.load(
3629
  init_params,
 
20
  from assignment_ui import create_assignment_ui
21
  from assignment_service import AssignmentService
22
  from submission_service import SubmissionService
23
+ from dashboard_service import DashboardService
24
 
25
  is_env_local = os.getenv("IS_ENV_LOCAL", "false") == "true"
26
  print(f"is_env_local: {is_env_local}")
 
55
 
56
  _AssignmentService = AssignmentService(GCS_SERVICE)
57
  _SubmissionService = SubmissionService(GCS_SERVICE)
58
+ _DashboardService = DashboardService(_AssignmentService, _SubmissionService)
59
 
60
  def update_scenario_input(scenario_radio):
61
  return scenario_radio
 
3625
  with gr.Accordion("💡 提醒", open=True):
3626
  gr.Markdown("Cutor 是你得力的作文批改小幫手,但它不是老師,和你一樣都在學習,偶爾也會出錯。如果你對於 Cutor 給你的建議有疑問,請提出和平台討論喔")
3627
  with gr.Row():
3628
+ assignment_interface = create_assignment_ui(user_data, _AssignmentService, _SubmissionService, _DashboardService)
3629
 
3630
  demo.load(
3631
  init_params,
assignment_ui.py CHANGED
@@ -1,7 +1,8 @@
1
  import gradio as gr
2
  from datetime import datetime
 
3
 
4
- def create_assignment_ui(user_data, assignment_service, submission_service):
5
  with gr.Blocks() as assignment_interface:
6
  with gr.Tab("老師|建立作業"):
7
  with gr.Row():
@@ -222,7 +223,7 @@ def create_assignment_ui(user_data, assignment_service, submission_service):
222
  def generate_submission_html(submission_json):
223
  html_parts = []
224
 
225
- # 添加外层结构的开始标签
226
  html_parts.append("""
227
  <div style="background-color: #f8f9fa; padding: 30px; border-radius: 15px; font-family: 'Helvetica', sans-serif;">
228
  <h2 style="color: #007bff; font-size: 28px; margin-bottom: 20px;">📝 學生回傳作業</h2>
@@ -530,4 +531,37 @@ def create_assignment_ui(user_data, assignment_service, submission_service):
530
  outputs=assignment_list
531
  )
532
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
533
  return assignment_interface
 
1
  import gradio as gr
2
  from datetime import datetime
3
+ import pandas as pd
4
 
5
+ def create_assignment_ui(user_data, assignment_service, submission_service, dashboard_service):
6
  with gr.Blocks() as assignment_interface:
7
  with gr.Tab("老師|建立作業"):
8
  with gr.Row():
 
223
  def generate_submission_html(submission_json):
224
  html_parts = []
225
 
226
+ # 添���外层结构的开始标签
227
  html_parts.append("""
228
  <div style="background-color: #f8f9fa; padding: 30px; border-radius: 15px; font-family: 'Helvetica', sans-serif;">
229
  <h2 style="color: #007bff; font-size: 28px; margin-bottom: 20px;">📝 學生回傳作業</h2>
 
531
  outputs=assignment_list
532
  )
533
 
534
+ with gr.Tab("儀表板") as dashboard_tab:
535
+ with gr.Row():
536
+ refresh_dashboard_button = gr.Button("刷新儀表板")
537
+
538
+ with gr.Row():
539
+ assignments_df = gr.Dataframe(
540
+ label="作業列表",
541
+ wrap=True,
542
+ )
543
+
544
+ with gr.Row():
545
+ submissions_df = gr.Dataframe(
546
+ label="所有提交的作業",
547
+ wrap=True,
548
+ )
549
+
550
+ def update_dashboard(user_data):
551
+ # 獲取作業列表
552
+ assignments = dashboard_service.get_dashboard_data(user_data)
553
+ assignments_df = pd.DataFrame(assignments)
554
+
555
+ # 獲取所有提交的作業
556
+ submissions = dashboard_service.get_all_submissions(user_data)
557
+ submissions_df = pd.DataFrame(submissions)
558
+
559
+ return assignments_df, submissions_df
560
+
561
+ refresh_dashboard_button.click(
562
+ fn=update_dashboard,
563
+ inputs=[user_data],
564
+ outputs=[assignments_df, submissions_df]
565
+ )
566
+
567
  return assignment_interface
dashboard_service.py ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from datetime import datetime, timezone
3
+ import pytz
4
+
5
+ class DashboardService:
6
+ def __init__(self, assignment_service, submission_service):
7
+ self.assignment_service = assignment_service
8
+ self.submission_service = submission_service
9
+
10
+ def get_dashboard_data(self, user_id):
11
+ assignments = self.assignment_service.get_user_assignments(user_id)
12
+ dashboard_data = []
13
+
14
+ for assignment_id, assignment_info in assignments.items():
15
+ assignment_data = self.assignment_service.get_assignment(assignment_id)
16
+ submission_ids = assignment_data.get("submission_ids", [])
17
+ submission_count = len(submission_ids)
18
+
19
+ dashboard_item = {
20
+ "assignment_id": assignment_id,
21
+ "topic": assignment_data["metadata"]["topic"],
22
+ "assignment_type": assignment_data["assignment_type"],
23
+ "submission_count": submission_count,
24
+ "creation_date": assignment_data["timestamp"],
25
+ "deadline": assignment_data["metadata"].get("submission_deadline")
26
+ }
27
+ dashboard_data.append(dashboard_item)
28
+
29
+ # 按創建日期降序排序
30
+ dashboard_data.sort(key=lambda x: x["creation_date"], reverse=True)
31
+ return dashboard_data
32
+
33
+ def get_assignment_details(self, assignment_id):
34
+ assignment_data = self.assignment_service.get_assignment(assignment_id)
35
+ submission_ids = assignment_data.get("submission_ids", [])
36
+ submissions = []
37
+
38
+ for submission_id in submission_ids:
39
+ submission_data = self.submission_service.get_submission_from_gcs(submission_id)
40
+ if submission_data:
41
+ submissions.append({
42
+ "submission_id": submission_id,
43
+ "student_id": submission_data["student_id"],
44
+ "student_name": submission_data["student_name"],
45
+ "submission_date": submission_data["timestamp"]
46
+ })
47
+
48
+ return {
49
+ "assignment_data": assignment_data,
50
+ "submissions": submissions
51
+ }
52
+
53
+ def get_submission_details(self, submission_id):
54
+ submission_data = self.submission_service.get_submission_from_gcs(submission_id)
55
+ if not submission_data:
56
+ return {"error": "找不到提交記錄"}
57
+
58
+ assignment_data = self.assignment_service.get_assignment(submission_data["assignment_id"])
59
+ return {
60
+ "submission_data": submission_data,
61
+ "assignment_data": assignment_data
62
+ }
63
+
64
+ def get_all_submissions(self, user_id):
65
+ assignments = self.assignment_service.get_user_assignments(user_id)
66
+ all_submissions = []
67
+
68
+ for assignment_id, assignment_info in assignments.items():
69
+ assignment_data = self.assignment_service.get_assignment(assignment_id)
70
+ submission_ids = assignment_data.get("submission_ids", [])
71
+
72
+ for submission_id in submission_ids:
73
+ submission_data = self.submission_service.get_submission_from_gcs(submission_id)
74
+ if submission_data:
75
+ score = self.extract_score(submission_data)
76
+ all_submissions.append({
77
+ "作業名稱": assignment_data["metadata"]["topic"],
78
+ "作業類型": assignment_data["assignment_type"],
79
+ "學生_id": submission_data["student_id"],
80
+ "學生姓名": submission_data["student_name"],
81
+ "繳交日期": submission_data["timestamp"],
82
+ "分數": score
83
+ })
84
+
85
+ all_submissions.sort(key=lambda x: x["繳交日期"], reverse=True)
86
+ return all_submissions
87
+
88
+ def extract_score(self, submission_data):
89
+ try:
90
+ content = submission_data.get("submission_data", {}).get("content", {})
91
+ if isinstance(content, str):
92
+ content = json.loads(content)
93
+
94
+ output_table = content.get("chinese_full_paragraph_evaluate_output_table", [])
95
+
96
+ for item in output_table:
97
+ if item.get("架構") == "綜合評分":
98
+ return item.get("評分", "N/A")
99
+ except Exception as e:
100
+ print(f"提取分數時出錯:{str(e)}")
101
+ print(f"提交數據:{submission_data}")
102
+
103
+ return "N/A"