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

นี่คือคำแนะนำแบบทีละขั้นตอนที่ 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 คุณจะดูข้อมูลนี้ได้ใน 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 ต้องใช้teacher ขอบเขต OAuth คุณไม่ควรมอบขอบเขต 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