Spaces:
Sleeping
Sleeping
dash init
Browse files- app.py +3 -1
- assignment_ui.py +36 -2
- 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"
|