คะแนนไฟล์แนบและคะแนนเกรด

นี่คือคำแนะนำแบบทีละขั้นตอนที่ 6 ในชุดคำแนะนำแบบทีละขั้นตอนสำหรับส่วนเสริมของ Classroom

ในคำแนะนำแบบทีละขั้นนี้ คุณจะแก้ไขตัวอย่างจากขั้นตอนคำแนะนำแบบทีละขั้นก่อนหน้า เพื่อสร้างไฟล์แนบประเภทกิจกรรมที่ให้คะแนน นอกจากนี้ คุณยังส่งคะแนนกลับ ไปยัง Google Classroom โดยอัตโนมัติ ซึ่งจะปรากฏในสมุดพกของครู เป็นคะแนนฉบับร่าง

คำแนะนำแบบทีละขั้นนี้แตกต่างจากคำแนะนำอื่นๆ ในชุดเล็กน้อยตรงที่มี แนวทางที่เป็นไปได้ 2 แนวทางในการส่งคะแนนกลับไปยัง Classroom ทั้ง 2 อย่างส่งผลต่อประสบการณ์ของนักพัฒนาแอปและผู้ใช้แตกต่างกัน โปรดพิจารณาทั้ง 2 อย่างเมื่อออกแบบส่วนเสริมของ Classroom อ่านข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการติดตั้งใช้งานได้ที่หน้าคู่มือการโต้ตอบกับไฟล์แนบ

โปรดทราบว่าฟีเจอร์การให้คะแนนใน API เป็นตัวเลือก โดยใช้ร่วมกับไฟล์แนบประเภทกิจกรรมได้

ในคำแนะนำแบบทีละขั้นนี้ คุณจะทำสิ่งต่อไปนี้

  • แก้ไขคำขอก่อนหน้าในการสร้างไฟล์แนบไปยัง Classroom API เพื่อตั้งค่าตัวหารของคะแนนของไฟล์แนบด้วย
  • ให้คะแนนงานที่นักเรียนส่งโดยอัตโนมัติและตั้งค่าตัวเศษของคะแนนไฟล์แนบ
  • ใช้ 2 วิธีเพื่อส่งคะแนนของงานที่ส่งไปยัง Classroom โดยใช้ข้อมูลเข้าสู่ระบบของครูที่ลงชื่อเข้าใช้หรือออฟไลน์

เมื่อเสร็จแล้ว คะแนนจะปรากฏในสมุดพกของ Classroom หลังจากที่ระบบทริกเกอร์ ลักษณะการทำงานของการส่งคืน ช่วงเวลาที่แน่นอนที่เกิดเหตุการณ์นี้ขึ้นอยู่กับ แนวทางการติดตั้งใช้งาน

สำหรับตัวอย่างนี้ ให้ใช้กิจกรรมจากคำแนะนำแบบทีละขั้นตอนก่อนหน้าซ้ำ ซึ่งเป็นกิจกรรมที่แสดงรูปภาพสถานที่สำคัญที่มีชื่อเสียงแก่นักเรียนและแจ้งให้นักเรียนป้อนชื่อสถานที่ดังกล่าว ให้คะแนนเต็มสำหรับไฟล์แนบหากนักเรียน/นักศึกษา ป้อนชื่อที่ถูกต้อง มิเช่นนั้นให้คะแนนเป็น 0

ทำความเข้าใจฟีเจอร์การให้คะแนนของ Classroom Add-ons API

ส่วนเสริมของคุณสามารถตั้งค่าทั้งตัวเศษและตัวส่วนของคะแนนสำหรับไฟล์แนบได้ โดยจะตั้งค่าเหล่านี้ตามลำดับโดยใช้ค่า pointsEarned และ maxPoints ใน API การ์ดไฟล์แนบใน UI ของ Classroom จะแสดงmaxPointsเมื่อมีการตั้งค่า

ตัวอย่างไฟล์แนบหลายรายการที่มี maxPoints ในงานหนึ่ง

รูปที่ 1 UI การสร้างงานที่มีการ์ดไฟล์แนบของส่วนเสริม 3 รายการซึ่งมีmaxPointsตั้งค่าไว้

API ส่วนเสริมของ Classroom ช่วยให้คุณกำหนดการตั้งค่าและตั้งค่าคะแนนที่ได้สำหรับคะแนนไฟล์แนบ คะแนนเหล่านี้ไม่เหมือนกับคะแนนงาน อย่างไรก็ตาม การตั้งค่าคะแนนงานจะทำตามการตั้งค่าคะแนนไฟล์แนบของไฟล์แนบที่มีป้ายกำกับการซิงค์คะแนนบน การ์ดไฟล์แนบ เมื่อไฟล์แนบ "การซิงค์คะแนน" ตั้งค่า pointsEarned สำหรับงานที่นักเรียนส่ง ระบบจะตั้งค่าคะแนนคร่าวๆ ของนักเรียนสำหรับงานนั้นด้วย

โดยปกติแล้ว ไฟล์แนบแรกที่เพิ่มลงในงานซึ่งตั้งค่า maxPoints จะได้รับป้ายกำกับ "การซิงค์เกรด" ดูตัวอย่าง UI การสร้างงาน ที่แสดงในรูปที่ 1 เพื่อดูตัวอย่างป้ายกำกับ "การซิงค์คะแนน" โปรดทราบว่า การ์ด "ไฟล์แนบ 1" มีป้ายกำกับ "การซิงค์คะแนน" และคะแนนงาน ในกรอบสีแดงได้รับการอัปเดตเป็น 50 คะแนนแล้ว โปรดทราบว่าแม้ว่ารูปที่ 1 จะแสดงการ์ดไฟล์แนบ 3 ใบ แต่มีเพียงการ์ดเดียวที่มีป้ายกำกับ "การซิงค์คะแนน" ข้อจำกัดที่สำคัญของการใช้งานในปัจจุบันคือ มีเพียงไฟล์แนบเดียวเท่านั้นที่ติดป้ายกำกับ "การซิงค์คะแนน" ได้

หากมีไฟล์แนบหลายรายการที่ตั้งค่า maxPoints ไว้ การนำไฟล์แนบที่มี "การซิงค์คะแนน" ออกไม่ได้เปิดใช้ "การซิงค์คะแนน" ในไฟล์แนบที่เหลือ การเพิ่มไฟล์แนบอีกรายการที่ตั้งค่า maxPoints จะทำให้มีการ เปิดใช้การซิงค์คะแนนในไฟล์แนบใหม่ และคะแนนสูงสุดของงานจะปรับ ให้ตรงกัน ไม่มีกลไกในการดูแบบเป็นโปรแกรมว่าไฟล์แนบใดมีป้ายกำกับ "การซิงค์คะแนน" หรือดูว่างานหนึ่งๆ มีไฟล์แนบกี่ไฟล์

กำหนดคะแนนสูงสุดของไฟล์แนบ

ส่วนนี้อธิบายการตั้งค่าตัวหารสำหรับคะแนนไฟล์แนบ ซึ่งก็คือคะแนนสูงสุดที่นักเรียนทุกคนจะได้รับจากการส่งงาน โดยตั้งค่า maxPoints ของไฟล์แนบ

คุณเพียงต้องแก้ไขการติดตั้งใช้งานที่มีอยู่เล็กน้อยเพื่อเปิดใช้ฟีเจอร์การให้คะแนน เมื่อสร้างไฟล์แนบ ให้เพิ่มค่า maxPoints ในออบเจ็กต์ AddOnAttachment เดียวกันที่มี studentWorkReviewUri, teacherViewUri และฟิลด์ไฟล์แนบอื่นๆ

โปรดทราบว่าคะแนนสูงสุดเริ่มต้นสำหรับงานใหม่คือ 100 เราขอแนะนำให้ตั้งค่า maxPoints เป็นค่าอื่นที่ไม่ใช่ 100 เพื่อให้คุณยืนยันได้ว่าระบบตั้งค่า เกรดอย่างถูกต้อง ตั้งค่า maxPoints เป็น 50 เพื่อเป็นการสาธิต

Python

เพิ่มฟิลด์ maxPoints เมื่อสร้างออบเจ็กต์ attachment ก่อนที่จะส่งคำขอ CREATE ไปยังcourses.courseWork.addOnAttachments Endpoint คุณจะดูข้อมูลนี้ได้ในไฟล์ webapp/attachment_routes.py หากทำตามตัวอย่างที่เราให้ไว้

attachment = {
    # Specifies the route for a teacher user.
    "teacherViewUri": {
        "uri":
            flask.url_for(
                "load_activity_attachment",
                _scheme='https',
                _external=True),
    },
    # Specifies the route for a student user.
    "studentViewUri": {
        "uri":
            flask.url_for(
                "load_activity_attachment",
                _scheme='https',
                _external=True)
    },
    # Specifies the route for a teacher user when the attachment is
    # loaded in the Classroom grading view.
    "studentWorkReviewUri": {
        "uri":
            flask.url_for(
                "view_submission", _scheme='https', _external=True)
    },
    # Sets the maximum points that a student can earn for this activity.
    # This is the denominator in a fractional representation of a grade.
    "maxPoints": 50,
    # The title of the attachment.
    "title": f"Attachment {attachment_count}",
}

เพื่อวัตถุประสงค์ของการสาธิตนี้ คุณยังจัดเก็บค่า maxPoints ใน ฐานข้อมูลไฟล์แนบในเครื่องด้วย ซึ่งจะช่วยให้ไม่ต้องทำการเรียก API เพิ่มเติม ในภายหลังเมื่อให้คะแนนงานที่นักเรียน/นักศึกษาส่ง อย่างไรก็ตาม โปรดทราบว่าครูอาจเปลี่ยนการตั้งค่าคะแนนของงานโดยไม่ขึ้นอยู่กับส่วนเสริมของคุณ ส่งคำขอ GET ไปยังcourses.courseWork อุปกรณ์ปลายทางเพื่อดูค่า maxPoints ระดับการมอบหมาย เมื่อดำเนินการดังกล่าว ให้ส่ง itemId ในช่อง CourseWork.id

ตอนนี้ให้อัปเดตรูปแบบฐานข้อมูลเพื่อเก็บค่า maxPoints ของไฟล์แนบด้วย เราขอแนะนำให้ใช้ค่า maxPoints จากการตอบกลับ CREATE

Python

ก่อนอื่น ให้เพิ่มmax_pointsฟิลด์ลงในตาราง Attachment คุณจะเห็นข้อมูลนี้ ในไฟล์ webapp/models.py หากทำตามตัวอย่างที่เราให้ไว้

# Database model to represent an attachment.
class Attachment(db.Model):
    # The attachmentId is the unique identifier for the attachment.
    attachment_id = db.Column(db.String(120), primary_key=True)

    # The image filename to store.
    image_filename = db.Column(db.String(120))

    # The image caption to store.
    image_caption = db.Column(db.String(120))

    # The maximum number of points for this activity.
    max_points = db.Column(db.Integer)

กลับไปที่คำขอ courses.courseWork.addOnAttachments CREATE จัดเก็บค่า maxPoints ที่แสดงในคำตอบ

new_attachment = Attachment(
    # The new attachment's unique ID, returned in the CREATE response.
    attachment_id=resp.get("id"),
    image_filename=key,
    image_caption=value,
    # Store the maxPoints value returned in the response.
    max_points=int(resp.get("maxPoints")))
db.session.add(new_attachment)
db.session.commit()

ตอนนี้ไฟล์แนบมีคะแนนสูงสุดแล้ว คุณควรทดสอบลักษณะการทำงานนี้ได้แล้วในตอนนี้ โดยเพิ่มไฟล์แนบในงานใหม่ แล้วสังเกตว่าการ์ดไฟล์แนบ แสดงป้ายกำกับ "การซิงค์คะแนน" และค่า "คะแนน" ของงานมีการเปลี่ยนแปลง

ให้คะแนนงานที่นักเรียนส่งใน Classroom

ส่วนนี้จะอธิบายการตั้งค่าตัวเศษสำหรับคะแนนไฟล์แนบ ซึ่งก็คือคะแนนของนักเรียนแต่ละคนสำหรับไฟล์แนบ ในการดำเนินการดังกล่าว ให้ตั้งค่า pointsEarned ของไฟล์แนบที่นักเรียนส่ง

ตอนนี้คุณต้องตัดสินใจเรื่องสำคัญ นั่นคือ ส่วนเสริมควรส่งคำขอเพื่อตั้งค่าpointsEarnedอย่างไร

ปัญหาคือการตั้งค่า pointsEarned ต้องใช้ขอบเขต OAuth ของ teacher คุณไม่ควรมอบขอบเขต teacher ให้กับผู้ใช้ที่เป็นนักเรียน/นักศึกษา เนื่องจากอาจส่งผลให้เกิดลักษณะการทำงานที่ไม่คาดคิดเมื่อนักเรียน/นักศึกษาโต้ตอบกับส่วนเสริม เช่น การโหลด iframe ของมุมมองครูแทน iframe ของมุมมองนักเรียน/นักศึกษา ดังนั้นคุณจึงมีตัวเลือก 2 ตัวเลือก ในการตั้งค่า pointsEarned ดังนี้

  • ใช้ข้อมูลเข้าสู่ระบบของครูที่เข้าสู่ระบบ
  • ใช้ข้อมูลเข้าสู่ระบบของครูที่จัดเก็บไว้ (ออฟไลน์)

ส่วนต่อไปนี้จะกล่าวถึงข้อดีข้อเสียของแต่ละวิธีก่อน แสดงการติดตั้งใช้งานแต่ละวิธี โปรดทราบว่าตัวอย่างที่เราให้ไว้แสดงให้เห็นถึงแนวทางทั้ง 2 แบบในการส่งเกรดไปยัง Classroom โปรดดูวิธีการเฉพาะภาษาด้านล่างเพื่อดูวิธีเลือกแนวทางเมื่อเรียกใช้ตัวอย่างที่เราให้ไว้

Python

ค้นหาประกาศ SET_GRADE_WITH_LOGGED_IN_USER_CREDENTIALS ที่ด้านบน ของไฟล์ webapp/attachment_routes.py ตั้งค่านี้เป็น True เพื่อส่งคะแนนกลับ โดยใช้ข้อมูลเข้าสู่ระบบของครูที่ลงชื่อเข้าใช้ ตั้งค่านี้เป็น False เพื่อส่งเกรด/คะแนนกลับโดยใช้ข้อมูลเข้าสู่ระบบที่จัดเก็บไว้เมื่อนักเรียนนักศึกษาส่งกิจกรรม

ให้คะแนนโดยใช้ข้อมูลเข้าสู่ระบบของครูที่ลงชื่อเข้าใช้

ใช้ข้อมูลเข้าสู่ระบบของผู้ใช้ที่ลงชื่อเข้าใช้เพื่อส่งคำขอตั้งค่า pointsEarned ซึ่งควรจะดูค่อนข้างใช้งานง่ายเนื่องจากเป็นการจำลองการติดตั้งใช้งานส่วนอื่นๆ จนถึงตอนนี้ และใช้ความพยายามเพียงเล็กน้อยในการดำเนินการ

อย่างไรก็ตาม โปรดทราบว่าครูจะโต้ตอบเฉพาะกับงานที่นักเรียนส่งใน iframe ของการตรวจงานของนักเรียนเท่านั้น ซึ่งมีผลกระทบที่สำคัญบางประการ ดังนี้

  • ระบบจะไม่แสดงคะแนนใน Classroom จนกว่าครูจะดำเนินการใน UI ของ Classroom
  • ครูอาจต้องเปิดผลงานที่นักเรียนส่งมาทั้งหมดเพื่อป้อนคะแนนของนักเรียนทุกคน
  • อาจมีความล่าช้าเล็กน้อยระหว่างที่ Classroom ได้รับคะแนนกับการแสดงคะแนนใน UI ของ Classroom โดยปกติแล้วความล่าช้าจะอยู่ที่ 5-10 วินาที แต่อาจนานถึง 30 วินาที

การรวมกันของปัจจัยเหล่านี้หมายความว่าครูอาจต้องทำงานด้วยตนเองเป็นจำนวนมากและใช้เวลานานเพื่อป้อนคะแนนของชั้นเรียนให้ครบถ้วน

หากต้องการใช้แนวทางนี้ ให้เพิ่มการเรียก API อีก 1 รายการไปยังเส้นทาง Student Work Review ที่มีอยู่

หลังจากดึงข้อมูลบันทึกงานที่นักเรียนส่งและไฟล์แนบแล้ว ให้ประเมินงานที่นักเรียนส่งและจัดเก็บคะแนนที่ได้ ตั้งค่าคะแนนในpointsEarnedฟิลด์ของออบเจ็กต์ AddOnAttachmentStudentSubmission สุดท้าย ให้ส่งคำขอ PATCH ไปยังcourses.courseWork.addOnAttachments.studentSubmissions ปลายทางพร้อมกับอินสแตนซ์ AddOnAttachmentStudentSubmission ในเนื้อหาของคำขอ โปรดทราบว่าเรา ต้องระบุ pointsEarned ใน updateMask ในคำขอ PATCH ด้วย

Python

# Look up the student's submission in our database.
student_submission = Submission.query.get(flask.session["submissionId"])

# Look up the attachment in the database.
attachment = Attachment.query.get(student_submission.attachment_id)

grade = 0

# See if the student response matches the stored name.
if student_submission.student_response.lower(
) == attachment.image_caption.lower():
    grade = attachment.max_points

# Create an instance of the Classroom service.
classroom_service = ch._credential_handler.get_classroom_service()

# Build an AddOnAttachmentStudentSubmission instance.
add_on_attachment_student_submission = {
    # Specifies the student's score for this attachment.
    "pointsEarned": grade,
}

# Issue a PATCH request to set the grade numerator for this attachment.
patch_grade_response = classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().patch(
    courseId=flask.session["courseId"],
    itemId=flask.session["itemId"],
    attachmentId=flask.session["attachmentId"],
    submissionId=flask.session["submissionId"],
    # updateMask is a list of fields being modified.
    updateMask="pointsEarned",
    body=add_on_attachment_student_submission).execute()

ตั้งค่าคะแนนโดยใช้ข้อมูลเข้าสู่ระบบของครูแบบออฟไลน์

วิธีที่ 2 ในการตั้งค่าคะแนนกำหนดให้ใช้ข้อมูลเข้าสู่ระบบที่จัดเก็บไว้ สำหรับครูที่สร้างไฟล์แนบ การติดตั้งใช้งานนี้กำหนดให้คุณสร้างข้อมูลเข้าสู่ระบบโดยใช้โทเค็นการรีเฟรชและโทเค็นเพื่อการเข้าถึงของครูที่ได้รับอนุญาตก่อนหน้านี้ จากนั้นใช้ข้อมูลเข้าสู่ระบบเหล่านี้เพื่อตั้งค่า pointsEarned

ข้อดีที่สำคัญของแนวทางนี้คือ ระบบจะป้อนคะแนนโดยไม่ต้องให้ครู ดำเนินการใดๆ ใน UI ของ Classroom ซึ่งจะช่วยหลีกเลี่ยงปัญหาที่กล่าวถึงข้างต้น ผลลัพธ์คือผู้ใช้ปลายทางจะรับรู้ถึงประสบการณ์การให้คะแนน ว่าราบรื่นและมีประสิทธิภาพ นอกจากนี้ วิธีนี้ยังช่วยให้คุณเลือกช่วงเวลาที่จะส่งคืนคะแนนได้ เช่น เมื่อนักเรียนทำกิจกรรมเสร็จหรือแบบไม่พร้อมกัน

ทําตามงานต่อไปนี้ให้เสร็จสมบูรณ์เพื่อใช้แนวทางนี้

  1. แก้ไขระเบียนฐานข้อมูลผู้ใช้เพื่อจัดเก็บโทเค็นเพื่อการเข้าถึง
  2. แก้ไขระเบียนฐานข้อมูลไฟล์แนบเพื่อจัดเก็บรหัสครู
  3. เรียกข้อมูลเข้าสู่ระบบของครูและ (ไม่บังคับ) สร้างอินสแตนซ์บริการ Classroom ใหม่
  4. กำหนดคะแนนของงานที่ส่ง

สำหรับการสาธิตนี้ ให้ตั้งค่าคะแนนเมื่อนักเรียนทำกิจกรรมเสร็จ นั่นคือเมื่อนักเรียนส่งแบบฟอร์มในเส้นทางมุมมองของนักเรียน

แก้ไขบันทึกฐานข้อมูลผู้ใช้เพื่อจัดเก็บโทเค็นเพื่อการเข้าถึง

ต้องใช้โทเค็นที่ไม่ซ้ำกัน 2 รายการเพื่อทำการเรียก API ได้แก่ โทเค็นการรีเฟรชและโทเค็นเพื่อการเข้าถึง หากคุณทำตามวิดีโอแนะนำแบบทีละขั้นตอนมาจนถึงตอนนี้ Userสคีมาตารางควรจัดเก็บโทเค็นการรีเฟรชอยู่แล้ว การจัดเก็บโทเค็นการรีเฟรชก็เพียงพอแล้วเมื่อคุณเรียก API ด้วยผู้ใช้ที่ลงชื่อเข้าใช้เท่านั้น เนื่องจากคุณจะได้รับโทเค็นเพื่อการเข้าถึงเป็นส่วนหนึ่งของขั้นตอนการตรวจสอบสิทธิ์

อย่างไรก็ตาม ตอนนี้คุณต้องโทรในฐานะบุคคลอื่นที่ไม่ใช่ผู้ใช้ที่ลงชื่อเข้าใช้ ซึ่งหมายความว่าขั้นตอนการตรวจสอบสิทธิ์จะใช้งานไม่ได้ ดังนั้น คุณจึงต้องจัดเก็บโทเค็นเพื่อเข้าถึงควบคู่ไปกับโทเค็นการรีเฟรช อัปเดตสคีมาตาราง User ให้มีโทเค็นเพื่อการเข้าถึงโดยทำดังนี้

Python

ในตัวอย่างที่เราให้ไว้ ข้อมูลนี้จะอยู่ในไฟล์ webapp/models.py

# Database model to represent a user.
class User(db.Model):
    # The user's identifying information:
    id = db.Column(db.String(120), primary_key=True)
    display_name = db.Column(db.String(80))
    email = db.Column(db.String(120), unique=True)
    portrait_url = db.Column(db.Text())

    # The user's refresh token, which will be used to obtain an access token.
    # Note that refresh tokens will become invalid if:
    # - The refresh token has not been used for six months.
    # - The user revokes your app's access permissions.
    # - The user changes passwords.
    # - The user belongs to a Google Cloud organization
    #   that has session control policies in effect.
    refresh_token = db.Column(db.Text())

    # An access token for this user.
    access_token = db.Column(db.Text())

จากนั้นอัปเดตรหัสที่สร้างหรืออัปเดตUserระเบียนเพื่อจัดเก็บโทเค็นเพื่อการเข้าถึงด้วย

Python

ในตัวอย่างที่เราให้ไว้ ข้อมูลนี้จะอยู่ในไฟล์ webapp/credential_handler.py

def save_credentials_to_storage(self, credentials):
    # Issue a request for the user's profile details.
    user_info_service = googleapiclient.discovery.build(
        serviceName="oauth2", version="v2", credentials=credentials)
    user_info = user_info_service.userinfo().get().execute()
    flask.session["username"] = user_info.get("name")
    flask.session["login_hint"] = user_info.get("id")

    # See if we have any stored credentials for this user. If they have used
    # the add-on before, we should have received login_hint in the query
    # parameters.
    existing_user = self.get_credentials_from_storage(user_info.get("id"))

    # If we do have stored credentials, update the database.
    if existing_user:
        if user_info:
            existing_user.id = user_info.get("id")
            existing_user.display_name = user_info.get("name")
            existing_user.email = user_info.get("email")
            existing_user.portrait_url = user_info.get("picture")

        if credentials and credentials.refresh_token is not None:
            existing_user.refresh_token = credentials.refresh_token
            # Update the access token.
            existing_user.access_token = credentials.token

    # If not, this must be a new user, so add a new entry to the database.
    else:
        new_user = User(
            id=user_info.get("id"),
            display_name=user_info.get("name"),
            email=user_info.get("email"),
            portrait_url=user_info.get("picture"),
            refresh_token=credentials.refresh_token,
            # Store the access token as well.
            access_token=credentials.token)

        db.session.add(new_user)

    db.session.commit()

แก้ไขระเบียนฐานข้อมูลไฟล์แนบเพื่อจัดเก็บรหัสครู

หากต้องการตั้งค่าคะแนนสำหรับกิจกรรม ให้เรียกใช้เพื่อตั้งค่า pointsEarned เป็น ครูในหลักสูตร คุณทำได้หลายวิธีดังนี้

  • จัดเก็บการแมปข้อมูลเข้าสู่ระบบของครูในเครื่องกับรหัสหลักสูตร อย่างไรก็ตาม โปรดทราบว่า ครูคนเดียวกันอาจไม่ได้เชื่อมโยงกับหลักสูตรใดหลักสูตรหนึ่งเสมอไป
  • ส่งคำขอ GET ไปยังcourses ปลายทางของ Classroom API เพื่อรับครูคนปัจจุบัน จากนั้นค้นหาบันทึกผู้ใช้ในเครื่องเพื่อค้นหา ข้อมูลเข้าสู่ระบบของครูที่ตรงกัน
  • เมื่อสร้างไฟล์แนบของส่วนเสริม ให้จัดเก็บรหัสครูในฐานข้อมูลไฟล์แนบในเครื่อง จากนั้นดึงข้อมูลเข้าสู่ระบบของครูจาก attachmentId ที่ส่งไปยัง iframe ของมุมมองนักเรียน

ตัวอย่างนี้แสดงตัวเลือกสุดท้ายเนื่องจากคุณกำลังตั้งค่าคะแนนเมื่อ นักเรียน/นักศึกษาทำกิจกรรมที่แนบมาเสร็จแล้ว

เพิ่มฟิลด์รหัสครูลงในAttachmentตารางของฐานข้อมูล

Python

ในตัวอย่างที่เราให้ไว้ ข้อมูลนี้จะอยู่ในไฟล์ webapp/models.py

# Database model to represent an attachment.
class Attachment(db.Model):
    # The attachmentId is the unique identifier for the attachment.
    attachment_id = db.Column(db.String(120), primary_key=True)

    # The image filename to store.
    image_filename = db.Column(db.String(120))

    # The image caption to store.
    image_caption = db.Column(db.String(120))

    # The maximum number of points for this activity.
    max_points = db.Column(db.Integer)

    # The ID of the teacher that created the attachment.
    teacher_id = db.Column(db.String(120))

จากนั้นอัปเดตโค้ดที่สร้างหรืออัปเดตระเบียน Attachment เพื่อจัดเก็บรหัสของผู้สร้างด้วย

Python

ในตัวอย่างที่เราให้ไว้ ข้อมูลนี้จะอยู่ในcreate_attachmentsเมธอดในไฟล์ webapp/attachment_routes.py

# Store the attachment by id.
new_attachment = Attachment(
    # The new attachment's unique ID, returned in the CREATE response.
    attachment_id=resp.get("id"),
    image_filename=key,
    image_caption=value,
    max_points=int(resp.get("maxPoints")),
    teacher_id=flask.session["login_hint"])
db.session.add(new_attachment)
db.session.commit()

เรียกข้อมูลเข้าสู่ระบบของครู

ค้นหาเส้นทางที่ให้บริการ iframe ของมุมมองนักเรียน หลังจากจัดเก็บคำตอบของนักเรียนในฐานข้อมูลในเครื่องแล้ว ให้ดึงข้อมูลเข้าสู่ระบบของครูจากที่เก็บข้อมูลในเครื่องทันที ซึ่งควรทำได้โดยง่ายเมื่อพิจารณาถึง การเตรียมการใน 2 ขั้นตอนก่อนหน้า นอกจากนี้ คุณยังใช้ข้อมูลเหล่านี้เพื่อสร้างอินสแตนซ์ใหม่ของบริการ Classroom สำหรับผู้ใช้ที่เป็นครูได้ด้วย

Python

ในตัวอย่างที่เราให้ไว้ ฟังก์ชันนี้จะอยู่ในเมธอด load_activity_attachment ในไฟล์ webapp/attachment_routes.py

# Create an instance of the Classroom service using the tokens for the
# teacher that created the attachment.

# We're assuming that there are already credentials in the session, which
# should be true given that we are adding this within the Student View
# route; we must have had valid credentials for the student to reach this
# point. The student credentials will be valid to construct a Classroom
# service for another user except for the tokens.
if not flask.session.get("credentials"):
    raise ValueError(
        "No credentials found in session for the requested user.")

# Make a copy of the student credentials so we don't modify the original.
teacher_credentials_dict = deepcopy(flask.session.get("credentials"))

# Retrieve the requested user's stored record.
teacher_record = User.query.get(attachment.teacher_id)

# Apply the user's tokens to the copied credentials.
teacher_credentials_dict["refresh_token"] = teacher_record.refresh_token
teacher_credentials_dict["token"] = teacher_record.access_token

# Construct a temporary credentials object.
teacher_credentials = google.oauth2.credentials.Credentials(
    **teacher_credentials_dict)

# Refresh the credentials if necessary; we don't know when this teacher last
# made a call.
if teacher_credentials.expired:
    teacher_credentials.refresh(Request())

# Request the Classroom service for the specified user.
teacher_classroom_service = googleapiclient.discovery.build(
    serviceName=CLASSROOM_API_SERVICE_NAME,
    version=CLASSROOM_API_VERSION,
    credentials=teacher_credentials)

ให้คะแนนงาน

ขั้นตอนจากนี้ไปจะเหมือนกับการใช้ข้อมูลเข้าสู่ระบบของครูที่ลงชื่อเข้าใช้ อย่างไรก็ตาม โปรดทราบว่าคุณควรโทรโดยใช้ข้อมูลเข้าสู่ระบบของครู ที่ดึงมาในขั้นตอนก่อนหน้า

Python

# Issue a PATCH request as the teacher to set the grade numerator for this
# attachment.
patch_grade_response = teacher_classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().patch(
    courseId=flask.session["courseId"],
    itemId=flask.session["itemId"],
    attachmentId=flask.session["attachmentId"],
    submissionId=flask.session["submissionId"],
    # updateMask is a list of fields being modified.
    updateMask="pointsEarned",
    body=add_on_attachment_student_submission).execute()

ทดสอบส่วนเสริม

เช่นเดียวกับคำแนะนำแบบทีละขั้นตอนก่อนหน้านี้ ให้สร้างงานที่มีไฟล์แนบประเภทกิจกรรมในฐานะครู ส่งคำตอบในฐานะนักเรียน จากนั้นเปิดงานที่ส่งใน iframe ของการตรวจสอบงานของนักเรียน คุณควรจะเห็นเกรดปรากฏในเวลาที่ต่างกันตามแนวทางการติดตั้งใช้งานของคุณ ดังนี้

  • หากเลือกส่งคะแนนคืนเมื่อนักเรียนทำกิจกรรมเสร็จแล้ว คุณควรเห็นคะแนนคร่าวๆ ของนักเรียนใน UI ก่อนที่จะเปิด iframe การตรวจงานของนักเรียน นอกจากนี้ คุณยังดูได้ในรายชื่อนักเรียนเมื่อเปิดงาน และในช่อง "เกรด/คะแนน" ข้าง iframe ของการตรวจสอบงานของนักเรียน
  • หากเลือกส่งคืนคะแนนเมื่อครูเปิด iframe ของงานของนักเรียน เพื่อตรวจสอบ คะแนนควรปรากฏในช่อง "คะแนน" หลังจากที่ iframe โหลดไม่นาน ดังที่กล่าวไว้ข้างต้น การดำเนินการนี้อาจใช้เวลาสูงสุด 30 วินาที หลังจากนั้น คะแนนของนักเรียนคนดังกล่าวควรจะปรากฏในมุมมองสมุดพกอื่นๆ ของ Classroom ด้วย

ตรวจสอบว่าคะแนนที่ถูกต้องปรากฏสำหรับนักเรียน/นักศึกษา

ยินดีด้วย คุณพร้อมที่จะไปยังขั้นตอนถัดไปแล้ว นั่นคือการสร้างไฟล์แนบ ภายนอก Google Classroom