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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

หากมีไฟล์แนบหลายรายการที่ตั้งค่า 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)

กลับไปยังคำขอCREATEสำหรับcourses.courseWork.addOnAttachments ร้านค้า ค่า 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 มุมมองของนักเรียน ดังนั้นคุณมี ตัวเลือกสำหรับวิธีตั้งค่า 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 รายการให้กับนักเรียนที่มีอยู่ เส้นทางการตรวจสอบงาน

หลังจากดึงข้อมูลงานที่นักเรียนส่งและบันทึกไฟล์แนบแล้ว ให้ประเมินผล งานที่นักเรียนส่งและเก็บเกรดที่ได้ กำหนดคะแนนในฟิลด์ ฟิลด์ 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. กำหนดคะแนนของงาน

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

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

การเรียก API ต้องใช้โทเค็นที่ไม่ซ้ำกัน 2 รายการ ได้แก่ โทเค็นการรีเฟรช โทเค็นเพื่อการเข้าถึง หากคุณติดตามดูชุดคำแนะนำแบบทีละขั้นมาก่อนหน้านี้ สคีมาของตาราง 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