Điểm của tệp đính kèm và điểm trả về

Đây là hướng dẫn thứ sáu trong chuỗi hướng dẫn từng bước về tiện ích bổ sung trong Lớp học.

Trong hướng dẫn này, bạn sẽ sửa đổi ví dụ từ bước hướng dẫn trước đó để tạo tệp đính kèm thuộc loại hoạt động đã chấm điểm. Bạn cũng có thể chuyển điểm về lại Google Lớp học theo phương thức lập trình. Điểm này sẽ xuất hiện trong sổ điểm của giáo viên dưới dạng điểm không chính thức.

Hướng dẫn này hơi khác so với những hướng dẫn khác trong loạt video này, vì có 2 phương pháp chuyển điểm về lại Lớp học. Cả hai đều có tác động riêng biệt đối với trải nghiệm người dùng và nhà phát triển. Hãy cân nhắc cả hai yếu tố này khi bạn thiết kế tiện ích bổ sung cho Lớp học. Đọc trang hướng dẫn Tương tác với tệp đính kèm của chúng tôi để thảo luận thêm về các tuỳ chọn triển khai.

Lưu ý rằng các tính năng chấm điểm trong API là không bắt buộc. Bạn có thể dùng các tính năng này với mọi tệp đính kèm thuộc loại hoạt động.

Trong quá trình hướng dẫn này, bạn sẽ hoàn thành các bước sau:

  • Sửa đổi các yêu cầu tạo tệp đính kèm trước đây cho API Lớp học để đặt mẫu số điểm của tệp đính kèm.
  • Theo phương thức lập trình, tính điểm cho bài tập mà học viên nộp và đặt tử số điểm của tệp đính kèm.
  • Triển khai 2 phương pháp để chuyển điểm bài tập nộp vào Lớp học bằng thông tin đăng nhập của giáo viên đã đăng nhập hoặc ngoại tuyến.

Sau khi hoàn tất, điểm sẽ xuất hiện trong sổ điểm trên Lớp học sau khi hành vi trả về được kích hoạt. Thời điểm chính xác khi điều này xảy ra phụ thuộc vào phương pháp triển khai.

Nhằm mục đích của ví dụ này, hãy sử dụng lại hoạt động từ hướng dẫn trước đó, trong đó học viên thấy hình ảnh của một địa danh nổi tiếng và được nhắc nhập tên của địa danh đó. Cho điểm đầy đủ cho tệp đính kèm nếu học viên nhập đúng tên, nếu không thì sẽ không.

Tìm hiểu tính năng chấm điểm bằng API tiện ích bổ sung của Lớp học

Tiện ích bổ sung của bạn có thể đặt cả tử số điểm và mẫu số điểm cho một tệp đính kèm. Các giá trị này được đặt lần lượt bằng cách sử dụng các giá trị pointsEarnedmaxPoints trong API. Một thẻ đính kèm trong giao diện người dùng Lớp học sẽ cho biết giá trị maxPoints khi bạn đặt giá trị này.

Ví dụ về nhiều tệp đính kèm với maxPoints trên một bài tập

Hình 1. Giao diện người dùng tạo bài tập với 3 thẻ đính kèm tiện ích bổ sung đã đặt maxPoints.

API tiện ích bổ sung Lớp học cho phép bạn định cấu hình các chế độ cài đặt và đặt điểm đạt được cho điểm tệp đính kèm. Các điểm này không giống với điểm bài tập. Tuy nhiên, chế độ cài đặt điểm của bài tập tuân theo chế độ cài đặt điểm cho tệp đính kèm có nhãn Đồng bộ hoá điểm trên thẻ tệp đính kèm. Khi tệp đính kèm "Đồng bộ hoá điểm" đặt pointsEarned cho bài tập mà học viên nộp, thì điểm không chính thức của học viên trong bài tập đó cũng sẽ được đặt.

Thông thường, tệp đính kèm đầu tiên được thêm vào bài tập đặt maxPoints sẽ nhận được nhãn "Đồng bộ hoá điểm". Hãy xem ví dụ về giao diện người dùng tạo bài tập như trong Hình 1 để biết ví dụ về nhãn "Đồng bộ hoá điểm". Lưu ý rằng thẻ "Tệp đính kèm 1" có nhãn "Đồng bộ hoá điểm" và điểm của bài tập trong hộp màu đỏ đã được cập nhật thành 50 điểm. Ngoài ra, xin lưu ý rằng mặc dù Hình 1 cho thấy 3 thẻ đính kèm, nhưng chỉ có một thẻ có nhãn "Đồng bộ hoá điểm". Đây là hạn chế chính của phương thức triển khai hiện tại: chỉ một tệp đính kèm được gắn nhãn "Đồng bộ hoá điểm".

Nếu có nhiều tệp đính kèm đã đặt maxPoints, thì việc xoá tệp đính kèm với tính năng "Đồng bộ hoá điểm" sẽ không bật tính năng "Đồng bộ hoá điểm" trên mọi tệp đính kèm còn lại. Việc thêm một tệp đính kèm khác để thiết lập maxPoints sẽ bật tính năng Đồng bộ hoá điểm trên tệp đính kèm mới và điểm bài tập tối đa sẽ điều chỉnh cho phù hợp. Không có cơ chế lập trình để xem tệp đính kèm nào có nhãn "Đồng bộ hoá điểm" cũng như xem số lượng tệp đính kèm của một bài tập cụ thể.

Đặt điểm tối đa cho tệp đính kèm

Phần này mô tả cách đặt biểu mẫu cho điểm cho tệp đính kèm; tức là điểm số tối đa mà tất cả học viên có thể đạt được khi gửi. Để làm như vậy, hãy đặt giá trị maxPoints của tệp đính kèm.

Bạn chỉ cần sửa đổi một chút đối với phương thức triển khai hiện tại để bật các tính năng chấm điểm. Khi tạo tệp đính kèm, hãy thêm giá trị maxPoints vào cùng một đối tượng AddOnAttachment chứa studentWorkReviewUri, teacherViewUri và các trường đính kèm khác.

Lưu ý rằng điểm tối đa mặc định cho bài tập mới là 100. Bạn nên đặt maxPoints thành một giá trị khác 100 để có thể xác minh rằng điểm đang được đặt chính xác. Đặt maxPoints thành 50 làm giá trị minh hoạ:

Python

Thêm trường maxPoints khi tạo đối tượng attachment, ngay trước khi gửi yêu cầu CREATE cho điểm cuối courses.courseWork.addOnAttachments. Bạn có thể tìm thấy thông tin này trong tệp webapp/attachment_routes.py nếu làm theo ví dụ mà chúng tôi cung cấp.

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}",
}

Nhằm phục vụ mục đích của phần minh hoạ này, bạn cũng lưu trữ giá trị maxPoints trong cơ sở dữ liệu Tệp đính kèm cục bộ; nhờ vậy, sau này bạn sẽ không cần phải thực hiện lệnh gọi API bổ sung khi chấm điểm bài làm mà học viên nộp. Tuy nhiên, xin lưu ý rằng giáo viên có thể thay đổi chế độ cài đặt điểm bài tập một cách độc lập với tiện ích bổ sung của bạn. Gửi yêu cầu GET đến điểm cuối courses.courseWork để xem giá trị maxPoints ở cấp độ gán. Khi thực hiện việc này, hãy truyền itemId vào trường CourseWork.id.

Bây giờ, hãy cập nhật mô hình cơ sở dữ liệu của bạn để lưu giữ giá trị maxPoints của tệp đính kèm. Bạn nên dùng giá trị maxPoints trong phản hồi CREATE:

Python

Trước tiên, hãy thêm trường max_points vào bảng Attachment. Bạn có thể tìm thấy thông tin này trong tệp webapp/models.py nếu làm theo ví dụ chúng tôi cung cấp.

# 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)

Quay lại yêu cầu courses.courseWork.addOnAttachments CREATE. Lưu trữ giá trị maxPoints được trả về trong phản hồi.

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()

Tệp đính kèm hiện đã có điểm tối đa. Bạn có thể kiểm thử hành vi này ngay lúc này; thêm tệp đính kèm vào một bài tập mới và quan sát thấy thẻ tệp đính kèm cho thấy nhãn "Đồng bộ hoá điểm" và giá trị "Điểm" của bài tập sẽ thay đổi.

Đặt điểm mà học viên nộp trong Lớp học

Phần này mô tả cách đặt tử số cho tệp đính kèm; tức là điểm của một học viên cá nhân cho tệp đính kèm. Để làm như vậy, hãy đặt giá trị pointsEarned của học viên gửi.

Bây giờ, bạn cần đưa ra một quyết định quan trọng: tiện ích bổ sung của bạn nên yêu cầu đặt pointsEarned bằng cách nào?

Vấn đề là việc đặt pointsEarned yêu cầu phạm vi OAuth teacher. Bạn không nên cấp phạm vi teacher cho người dùng là học viên. Điều này có thể dẫn đến hành vi không mong muốn khi học viên tương tác với tiện ích bổ sung của bạn, chẳng hạn như tải iframe Chế độ xem dành cho giáo viên thay vì iframe Chế độ xem của học viên. Do đó, bạn có 2 lựa chọn về cách đặt pointsEarned:

  • Sử dụng thông tin đăng nhập của giáo viên.
  • Sử dụng thông tin đăng nhập của giáo viên (ngoại tuyến) đã lưu trữ.

Các phần sau đây thảo luận về ưu điểm của mỗi phương pháp trước khi minh hoạ từng cách triển khai. Xin lưu ý rằng các ví dụ chúng tôi cung cấp minh hoạ cả hai phương pháp để chuyển điểm vào Lớp học. Hãy xem hướng dẫn dành riêng cho từng ngôn ngữ bên dưới để biết cách chọn một phương pháp khi chạy các ví dụ được cung cấp:

Python

Tìm nội dung khai báo SET_GRADE_WITH_LOGGED_IN_USER_CREDENTIALS ở đầu tệp webapp/attachment_routes.py. Đặt giá trị này thành True để trả điểm bằng thông tin xác thực của giáo viên đã đăng nhập. Đặt giá trị này thành False để trả điểm bằng thông tin xác thực đã lưu trữ khi học viên gửi hoạt động.

Đặt điểm bằng thông tin đăng nhập của giáo viên đã đăng nhập

Sử dụng thông tin xác thực của người dùng đã đăng nhập để gửi yêu cầu đặt pointsEarned. Việc này có vẻ khá trực quan vì nó phản ánh phần còn lại của quá trình triển khai cho đến nay và không cần nhiều công sức để nhận ra.

Tuy nhiên, hãy lưu ý rằng giáo viên chỉ tương tác với bài tập mà học viên gửi trong iframe Bài đánh giá bài tập của học viên. Việc này mang lại một số ý nghĩa quan trọng:

  • Điểm sẽ không được điền trong Lớp học cho đến khi giáo viên thực hiện thao tác trong giao diện người dùng Lớp học.
  • Giáo viên có thể phải mở mọi bài tập mà học viên đã nộp để điền vào tất cả điểm của học viên.
  • Có một khoảng thời gian trễ ngắn giữa Lớp học khi nhận điểm và thời điểm xuất hiện điểm trong giao diện người dùng của Lớp học. Độ trễ thường là từ 5 đến 10 giây, nhưng cũng có thể dài tối đa 30 giây.

Khi kết hợp các yếu tố này, giáo viên có thể phải làm nhiều việc thủ công, tốn nhiều thời gian để điền đầy đủ điểm của lớp.

Để triển khai phương pháp này, hãy thêm một lệnh gọi API bổ sung vào tuyến Bài tập của học viên hiện có.

Sau khi tìm nạp hồ sơ về bài nộp và tệp đính kèm của học viên, hãy đánh giá bài tập mà học viên đã nộp và lưu trữ điểm kết quả. Đặt điểm trong trường pointsEarned của đối tượng AddOnAttachmentStudentSubmission. Cuối cùng, đưa ra yêu cầu PATCH đến điểm cuối courses.courseWork.addOnAttachments.studentSubmissions bằng thực thể AddOnAttachmentStudentSubmission trong nội dung yêu cầu. Xin lưu ý rằng chúng ta cũng cần chỉ định pointsEarned trong updateMask trong yêu cầu 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()

Đặt điểm bằng thông tin đăng nhập của giáo viên ngoại tuyến

Phương pháp đặt điểm thứ hai yêu cầu sử dụng thông tin đăng nhập được lưu trữ cho giáo viên đã tạo tệp đính kèm. Phương thức triển khai này yêu cầu bạn tạo thông tin xác thực bằng mã làm mới và mã truy cập của một giáo viên được uỷ quyền trước đó, sau đó sử dụng các thông tin xác thực này để đặt pointsEarned.

Ưu điểm quan trọng của phương pháp này là điểm sẽ được điền mà không cần giáo viên thao tác trong giao diện người dùng Lớp học, nhờ đó tránh được các vấn đề đã đề cập ở trên. Kết quả là người dùng cuối cảm thấy trải nghiệm chấm điểm là liền mạch và hiệu quả. Ngoài ra, phương pháp này cho phép bạn chọn khoảnh khắc bạn trả điểm, chẳng hạn như khi học viên hoàn thành hoạt động hoặc không đồng bộ.

Hoàn thành các nhiệm vụ sau để triển khai phương pháp này:

  1. Sửa đổi bản ghi cơ sở dữ liệu người dùng để lưu trữ mã truy cập.
  2. Sửa đổi bản ghi cơ sở dữ liệu đính kèm để lưu trữ mã nhận dạng giáo viên.
  3. Truy xuất thông tin đăng nhập của giáo viên và (không bắt buộc) tạo một thực thể dịch vụ Lớp học mới.
  4. Đặt điểm cho bài tập.

Để phục vụ mục đích của phần minh hoạ này, hãy đặt điểm khi học viên hoàn thành hoạt động; tức là khi học viên gửi biểu mẫu trong lộ trình Chế độ xem của học viên.

Sửa đổi bản ghi cơ sở dữ liệu người dùng để lưu trữ mã truy cập

Cần có hai mã thông báo duy nhất để thực hiện lệnh gọi API là mã làm mớimã truy cập. Nếu bạn đã làm theo loạt hướng dẫn này cho đến nay, thì giản đồ bảng User của bạn đã lưu trữ mã làm mới. Lưu trữ mã làm mới là đủ khi bạn chỉ thực hiện lệnh gọi API với người dùng đã đăng nhập, vì bạn sẽ nhận được mã truy cập trong quy trình xác thực.

Tuy nhiên, giờ đây, bạn cần thực hiện lệnh gọi với tư cách một người không phải là người dùng đã đăng nhập, nghĩa là quy trình xác thực không hoạt động. Do đó, bạn cần lưu trữ mã truy cập cùng với mã làm mới. Cập nhật giản đồ bảng User để thêm mã truy cập:

Python

Trong ví dụ chúng tôi cung cấp, phần phụ thuộc nằm trong tệp 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())

Sau đó, hãy cập nhật mọi mã tạo hoặc cập nhật bản ghi User để lưu trữ cả mã truy cập:

Python

Trong ví dụ chúng tôi cung cấp, phần phụ thuộc nằm trong tệp 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()

Sửa đổi bản ghi cơ sở dữ liệu đính kèm để lưu trữ mã nhận dạng giáo viên

Để đặt điểm cho một hoạt động, hãy thực hiện lệnh gọi để đặt pointsEarned làm giáo viên trong khoá học. Có một số cách để thực hiện việc này:

  • Lưu trữ mối liên kết cục bộ giữa thông tin đăng nhập của giáo viên với mã khoá học. Tuy nhiên, hãy lưu ý rằng không phải lúc nào cùng một giáo viên có thể được liên kết với một khoá học cụ thể.
  • Gửi các yêu cầu GET đến điểm cuối courses của API Lớp học để lấy(các) giáo viên hiện tại. Sau đó, hãy truy vấn hồ sơ người dùng cục bộ để tìm thông tin đăng nhập của giáo viên phù hợp.
  • Khi tạo tệp đính kèm của tiện ích bổ sung, hãy lưu trữ mã nhận dạng giáo viên trong cơ sở dữ liệu tệp đính kèm cục bộ. Sau đó, hãy truy xuất thông tin đăng nhập của giáo viên từ attachmentId được chuyển sang iframe Chế độ xem của học viên.

Ví dụ này minh hoạ lựa chọn cuối cùng vì bạn đặt điểm khi học viên hoàn tất tệp đính kèm cho hoạt động.

Thêm trường mã giáo viên vào bảng Attachment của cơ sở dữ liệu:

Python

Trong ví dụ chúng tôi cung cấp, phần phụ thuộc nằm trong tệp 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))

Sau đó, hãy cập nhật bất kỳ mã nào tạo hoặc cập nhật bản ghi Attachment để lưu trữ cả mã nhận dạng của người tạo:

Python

Trong ví dụ chúng tôi cung cấp, phương thức này nằm trong phương thức create_attachments trong tệp 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()

Truy xuất thông tin đăng nhập của giáo viên

Tìm tuyến phân phát iframe Chế độ xem của học viên. Ngay sau khi lưu trữ phản hồi của học viên trong cơ sở dữ liệu cục bộ, hãy truy xuất thông tin xác thực của giáo viên từ bộ nhớ cục bộ của bạn. Việc này phải đơn giản do đã được chuẩn bị trong 2 bước trước. Bạn cũng có thể sử dụng các lớp này để tạo một phiên bản mới của dịch vụ Lớp học cho người dùng là giáo viên:

Python

Trong ví dụ được cung cấp của chúng tôi, phương thức này nằm trong phương thức load_activity_attachment trong tệp 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)

Đặt điểm của bài tập

Quy trình ở đây giống với quy trình sử dụng thông tin đăng nhập của giáo viên đã đăng nhập. Tuy nhiên, lưu ý rằng bạn nên thực hiện cuộc gọi bằng thông tin đăng nhập của giáo viên được truy xuất ở bước trước:

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()

Kiểm thử tiện ích bổ sung

Tương tự như phần hướng dẫn trước, hãy tạo một bài tập có tệp đính kèm thuộc loại hoạt động với tư cách giáo viên, gửi câu trả lời với tư cách học viên, sau đó mở bài tập đã nộp trong iframe Bài tập của học viên. Bạn sẽ có thể thấy điểm xuất hiện tại các thời điểm khác nhau tuỳ thuộc vào phương pháp triển khai của bạn:

  • Nếu chọn trả điểm khi học viên hoàn thành hoạt động, bạn sẽ thấy điểm không chính thức của họ trong giao diện người dùng trước khi mở iframe Bài tập của học viên. Bạn cũng có thể thấy bài tập này trong danh sách học viên khi mở bài tập và trong hộp "Điểm" bên cạnh iframe Đánh giá bài tập của học viên.
  • Nếu bạn chọn trả điểm khi giáo viên mở iframe Đánh giá bài tập của học viên, thì điểm sẽ xuất hiện trong hộp "Điểm" ngay sau khi iframe tải. Như đã đề cập ở trên, quá trình này có thể mất đến 30 giây. Sau đó, điểm cho học viên cụ thể cũng sẽ xuất hiện trong các chế độ xem sổ điểm khác trên Lớp học.

Kiểm tra để đảm bảo học viên đã nhận được điểm chính xác.

Xin chúc mừng! Bạn đã sẵn sàng để chuyển sang bước tiếp theo: tạo tệp đính kèm bên ngoài Google Lớp học.