นี่คือคำแนะนำแบบทีละขั้นครั้งที่ 6 ในชุดคำแนะนำแบบทีละขั้นเกี่ยวกับส่วนเสริมของ Classroom
ในคำแนะนำแบบทีละขั้นนี้ คุณจะได้แก้ไขตัวอย่างจากขั้นตอนคำแนะนำแบบทีละขั้นก่อนหน้านี้เพื่อสร้างไฟล์แนบประเภทกิจกรรมที่ให้คะแนนแล้ว นอกจากนี้คุณยังส่งคะแนนกลับไปยัง Google Classroom แบบเป็นโปรแกรม ซึ่งจะปรากฏเป็นคะแนนคร่าวๆ ในสมุดพกของครู
คำแนะนำแบบทีละขั้นนี้แตกต่างจากเกมอื่นๆ ในซีรีส์เล็กน้อยตรงที่มีวิธีส่งคะแนนกลับไปที่ Classroom อยู่ 2 วิธี ทั้ง 2 อย่างส่งผลต่อนักพัฒนาซอฟต์แวร์และประสบการณ์ของผู้ใช้อย่างชัดเจน ดังนั้นโปรดพิจารณาทั้ง 2 อย่างนี้เมื่อคุณออกแบบส่วนเสริมของ Classroom อ่านหน้าคู่มือการโต้ตอบกับไฟล์แนบสำหรับการสนทนาเพิ่มเติมเกี่ยวกับตัวเลือกในการติดตั้งใช้งาน
โปรดทราบว่าฟีเจอร์การให้คะแนนใน API เป็นแบบไม่บังคับ ซึ่งใช้ได้กับไฟล์แนบประเภทกิจกรรมใดก็ได้
ในคำแนะนำแบบทีละขั้นนี้ คุณจะต้องดำเนินการต่อไปนี้ให้เสร็จสมบูรณ์
- แก้ไขคำขอสร้างไฟล์แนบที่ส่งมาก่อนหน้านี้สำหรับ Classroom API เพื่อตั้งค่าตัวส่วนคะแนนของไฟล์แนบ
- ให้คะแนนงานที่นักเรียนส่งโดยใช้โปรแกรมและตั้งค่าตัวเศษคะแนนของไฟล์แนบ
- ใช้ 2 วิธีเพื่อส่งคะแนนงานให้ Classroom โดยใช้ข้อมูลเข้าสู่ระบบของครูที่มีการลงชื่อเข้าใช้หรือแบบออฟไลน์
เมื่อเสร็จสิ้นแล้ว คะแนนจะปรากฏในสมุดพกของ Classroom หลังจากที่ระบบเรียกใช้รูปแบบรายการส่งคืน ช่วงเวลาที่แน่นอนที่เหตุการณ์นี้จะเกิดขึ้น ขึ้นอยู่กับแนวทางการใช้งาน
สำหรับในตัวอย่างนี้ ให้ใช้กิจกรรมจากคำแนะนำแบบทีละขั้นก่อนหน้าอีกครั้ง โดยนักเรียนจะเห็นรูปภาพจุดสังเกตที่มีชื่อเสียงและได้รับข้อความแจ้งให้ป้อนชื่อ ให้คะแนนไฟล์แนบแบบเต็มคะแนนหากนักเรียนป้อนชื่อที่ถูกต้อง หรือไม่เช่นนั้น
ทำความเข้าใจฟีเจอร์การให้คะแนน API ของส่วนเสริมของ Classroom
ส่วนเสริมจะกำหนดทั้งตัวเศษคะแนนและตัวส่วนคะแนนสำหรับไฟล์แนบได้ โดยจะตั้งค่าเหล่านี้โดยใช้ค่า pointsEarned
และ maxPoints
ใน API ตามลำดับ การ์ดไฟล์แนบใน UI ของ Classroom จะแสดงค่า maxPoints
เมื่อตั้งค่าไว้แล้ว
รูปที่ 1 UI การสร้างงานที่มีการ์ดไฟล์แนบของส่วนเสริม 3 ใบที่ตั้งค่า maxPoints
ไว้
API ส่วนเสริมของ Classroom จะช่วยให้คุณกำหนดการตั้งค่าและกำหนดคะแนนที่ได้รับสำหรับคะแนนของไฟล์แนบได้ ซึ่งไม่เหมือนกับคะแนนงาน แต่การตั้งค่าคะแนนของงานจะเป็นไปตามการตั้งค่าคะแนนของไฟล์แนบของไฟล์แนบที่มีป้ายกำกับการซิงค์คะแนนในการ์ดไฟล์แนบ เมื่อไฟล์แนบ "การซิงค์คะแนน" ตั้งค่า pointsEarned
สำหรับงานที่นักเรียนส่ง ระบบจะตั้งค่าคะแนนคร่าวๆ ให้กับงานของนักเรียนด้วย
โดยปกติแล้ว ไฟล์แนบรายการแรกที่เพิ่มลงในงานที่ตั้งค่า maxPoints
จะได้รับป้ายกำกับ "การซิงค์คะแนน" ดูตัวอย่าง UI การสร้างงานที่แสดงในรูปที่ 1 เพื่อดูตัวอย่างป้ายกำกับ "การซิงค์เกรด" โปรดทราบว่าการ์ด "ไฟล์แนบ 1" จะมีป้ายกำกับ "การซิงค์คะแนน" และมีการอัปเดตคะแนนงานในช่องสีแดงเป็น 50 คะแนน และโปรดทราบว่าแม้รูปที่ 1 จะแสดงการ์ดไฟล์แนบ 3 ใบ แต่มีเพียงการ์ดเดียวที่มีป้ายกำกับ "การซิงค์เกรด" ซึ่งนี่เป็นข้อจำกัดหลักของการใช้งานในปัจจุบัน นั่นคือไฟล์แนบได้เพียง 1 ไฟล์เท่านั้นที่มีป้ายกำกับ "การซิงค์คะแนน"
หากมีไฟล์แนบหลายรายการที่ตั้งค่า 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 มุมมองของนักเรียน คุณจึงมี 2 ตัวเลือกในการ
ตั้งค่า pointsEarned
ดังนี้
- ใช้ข้อมูลเข้าสู่ระบบของครูที่ลงชื่อเข้าสู่ระบบ
- ใช้ข้อมูลเข้าสู่ระบบของครูที่จัดเก็บไว้ (แบบออฟไลน์)
ส่วนต่อไปนี้จะอธิบายถึงข้อดีและข้อเสียของแต่ละวิธีก่อนที่จะสาธิตการใช้งานแต่ละแบบ โปรดทราบว่าตัวอย่างที่เราให้ไว้จะสาธิตการส่งคะแนนไปยัง Classroom ทั้ง 2 วิธี โปรดดูวิธีการเฉพาะภาษาด้านล่างเพื่อดูวิธีเลือกใช้ตัวอย่างที่มีให้
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 เพื่อหลีกเลี่ยงปัญหาที่กล่าวไว้ข้างต้น ผลลัพธ์ที่ได้คือผู้ใช้ปลายทางเห็นว่าประสบการณ์การให้คะแนน เป็นไปอย่างราบรื่นและมีประสิทธิภาพ นอกจากนี้ วิธีนี้จะช่วยให้คุณเลือกช่วงเวลาที่จะส่งคืนเกรดได้ เช่น เมื่อนักเรียนทำกิจกรรมเสร็จหรือไม่พร้อมกัน
ทำตามขั้นตอนต่อไปนี้เพื่อทำตามแนวทางนี้
- แก้ไขระเบียนฐานข้อมูลผู้ใช้เพื่อจัดเก็บโทเค็นเพื่อการเข้าถึง
- แก้ไขระเบียนฐานข้อมูลไฟล์แนบเพื่อเก็บรหัสครู
- เรียกข้อมูลเข้าสู่ระบบของครูและสร้างอินสแตนซ์บริการของ Classroom ใหม่ (ไม่บังคับ)
- กำหนดคะแนนของงาน
สำหรับการสาธิตนี้ ให้กำหนดคะแนนเมื่อนักเรียนทำกิจกรรมเสร็จ กล่าวคือเมื่อนักเรียนส่งแบบฟอร์มในเส้นทางมุมมองของนักเรียน
แก้ไขระเบียนฐานข้อมูลผู้ใช้เพื่อจัดเก็บโทเค็นเพื่อการเข้าถึง
การเรียก 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
รายการไปยัง Classroom API ปลายทางcourses
เพื่อรับครูคนปัจจุบัน จากนั้นค้นหาบันทึกผู้ใช้ในเครื่องเพื่อค้นหาข้อมูลเข้าสู่ระบบของครูที่ตรงกัน - เมื่อสร้างไฟล์แนบของส่วนเสริม ให้เก็บรหัสครูไว้ในฐานข้อมูลไฟล์แนบในเครื่อง จากนั้นเรียกข้อมูลเข้าสู่ระบบของครูจาก
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,
discoveryServiceUrl=f"https://classroom.googleapis.com/$discovery/rest?labels=ADD_ONS_ALPHA&key={GOOGLE_API_KEY}",
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