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