jutor_write / assignment_ui.py
youngtsai's picture
with gr.Tab("老師|作業列表") as assignment_list_tab:
e9e2b32
raw
history blame
9.35 kB
import gradio as gr
def create_assignment_ui(user_data, assignment_service, submission_service):
with gr.Blocks() as assignment_interface:
with gr.Tab("老師|建立作業"):
with gr.Row():
with gr.Column():
assignment_type_list = [
"中文寫作 AI 批改",
"英文寫作 AI 批改"
]
assignment_type = gr.Radio(choices=assignment_type_list, label="選擇類型")
grade = gr.Radio(["一年級", "二年級", "三年級", "四年級", "五年級", "六年級"], label="選擇年級")
topic = gr.Textbox(label="題目")
introduction = gr.Textbox(label="寫作引文(非必填)")
description = gr.Textbox(label="作業說明")
url = gr.Textbox(label="作業链接")
attach_materials = gr.Textbox(label="附加材料 (JSON 格式)", placeholder='[{"type": "video", "url": "link1", "description": "描述"}]')
submission_deadline = gr.Textbox(label="提交截止日期", placeholder="2024-09-01T23:59:59Z")
create_button = gr.Button("建立作業")
assignment_id_display_teacher = gr.Textbox(label="作業 ID", interactive=False)
assignment_metadata = gr.JSON(label="作業元數據")
create_button.click(
assignment_service.create_assignment_metadata,
inputs=[assignment_type, grade, topic, introduction, description, url, attach_materials, submission_deadline],
outputs=[assignment_metadata]
).then(
assignment_service.create_assignment,
inputs=[user_data, assignment_type, assignment_metadata],
outputs=[assignment_id_display_teacher]
)
with gr.Tab("老師|作業列表") as assignment_list_tab:
with gr.Row():
with gr.Column(scale=1):
get_all_assignments_button = gr.Button("獲取所有作業")
assignment_list = gr.Radio([], label="作業列表", interactive=True)
with gr.Column(scale=2):
assignment_data = gr.JSON(label="作業內容", visible=False)
assignment_data_markdown = gr.Markdown(label="作業內容", show_label=True)
with gr.Row():
with gr.Column(scale=1):
submissions_list_json = gr.JSON(visible=False)
submissions_list_radio = gr.Radio([], label="已提交的作業學生", interactive=True)
with gr.Column(scale=2):
submission_data_json = gr.JSON(label="提交內容", visible=False)
submission_data_markdown = gr.Markdown(label="提交內容")
def init_assignment_list_data(assignment_list_value=None):
assignment_list = gr.update(value=assignment_list_value)
assignment_data = gr.update(value=None)
assignment_data_markdown = gr.update(value=None)
submissions_list_json = gr.update(value=None)
submissions_list_radio = gr.update(choices=[], value=None)
submission_data_json = gr.update(value=None)
submission_data_markdown = gr.update(value=None)
return assignment_list, assignment_data, assignment_data_markdown, submissions_list_json, submissions_list_radio, submission_data_json, submission_data_markdown
def update_assignment_data_markdown(assignment_data):
markdown_value = f"""
### 作業類型: {assignment_data['assignment_type']}
### 作業年級: {assignment_data['metadata']['grade']}
### 作業題目: {assignment_data['metadata']['topic']}
### 日期: {assignment_data['timestamp']}
### 作業引文
{assignment_data['metadata']['introduction']}
### 作業說明:
{assignment_data['metadata']['description']}
### 作業連結: {assignment_data['metadata']['url']}
### 附加材料:
{assignment_data['metadata']['attach_materials']}
"""
return gr.update(value=markdown_value)
def update_submissions_list_radio(submission_ids):
choices = []
for submission_id in submission_ids:
submission_data = submission_service.get_submission_from_gcs(submission_id)
choice_text = f"{submission_data['student_name']}"
choice = (choice_text, submission_id)
choices.append(choice)
return gr.update(choices=choices)
def update_submission_data_markdown(submission_json):
markdown_value = f"""
### 提交內容
{submission_json['submission_data']['content']}
### 提交日期
{submission_json['timestamp']}
"""
return gr.update(value=markdown_value)
get_all_assignments_button.click(
assignment_service.update_assignment_list,
inputs=[user_data],
outputs=assignment_list
).then(
fn=init_assignment_list_data,
inputs=[],
outputs=[assignment_list, assignment_data, assignment_data_markdown, submissions_list_json, submissions_list_radio, submission_data_json, submission_data_markdown]
)
assignment_list.select(
fn=init_assignment_list_data,
inputs=[assignment_list],
outputs=[assignment_list, assignment_data, assignment_data_markdown, submissions_list_json, submissions_list_radio, submission_data_json, submission_data_markdown]
).then(
assignment_service.get_assignment,
inputs=[assignment_list],
outputs=[assignment_data]
).then(
fn=update_assignment_data_markdown,
inputs=[assignment_data],
outputs=[assignment_data_markdown]
).then(
assignment_service.get_assignment_submissions,
inputs=[assignment_list],
outputs=[submissions_list_json]
).then(
fn=update_submissions_list_radio,
inputs=[submissions_list_json],
outputs=[submissions_list_radio]
)
submissions_list_radio.select(
submission_service.get_submission_from_gcs,
inputs=[submissions_list_radio],
outputs=submission_data_json
).then(
fn=update_submission_data_markdown,
inputs=[submission_data_json],
outputs=[submission_data_markdown]
)
with gr.Tab("學生"):
with gr.Row():
with gr.Column():
assignment_id_input_student = gr.Textbox(label="作業 ID")
get_assignment_button = gr.Button("獲取作業")
assignment_display = gr.JSON(label="作業內容")
get_assignment_button.click(
assignment_service.get_assignment,
inputs=[assignment_id_input_student],
outputs=assignment_display
)
with gr.Row():
with gr.Column():
student_name_input = gr.Textbox(label="學生姓名")
submission_input = gr.Textbox(label="文字輸入")
submit_button = gr.Button("繳交作業")
submission_status = gr.Textbox(label="繳交狀態", interactive=False)
submit_button.click(
submission_service.submit_assignment,
inputs=[assignment_id_input_student, user_data, student_name_input, submission_input],
outputs=submission_status
)
with gr.Row():
with gr.Column():
load_submissions_button = gr.Button("獲取提交的作業")
submissions_radio = gr.Radio([], label="提交的作業", interactive=True)
submission_display = gr.JSON(label="作業內容")
load_submissions_button.click(
submission_service.update_submission_list,
inputs=[user_data],
outputs=submissions_radio
)
submissions_radio.select(
submission_service.get_submission_from_gcs,
inputs=[submissions_radio],
outputs=submission_display
)
return assignment_interface