Loại tệp đính kèm hoạt động

Đây là hướng dẫn thứ năm 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. Đây là mọi tệp đính kèm đòi hỏi học viên phải gửi, chẳng hạn như câu trả lời bằng văn bản, bài kiểm tra hoặc cấu phần phần mềm khác do học viên tạo.

Sự khác biệt giữa tệp đính kèm loại nội dung và loại hoạt động là quan trọng. Tệp đính kèm loại hoạt động khác với loại nội dung ở những điểm sau:

  • Nút "Nộp bài" sẽ xuất hiện ở trên cùng bên phải của iframe Chế độ xem của học viên.
  • Đây là mã nhận dạng duy nhất của bài tập của học viên.
  • Thẻ đính kèm của học viên sẽ xuất hiện trong giao diện người dùng của tính năng chấm điểm trên Lớp học.
  • Họ có thể chấm điểm cho bài tập mà họ tham gia.

Hãy xem hướng dẫn từng bước tiếp theo để tham khảo nội dung thảo luận về cách chấm điểm. Trong quá trình thực hiện, 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ạo tệp đính kèm thuộc loại hoạt động.
  • Triển khai bộ nhớ liên tục để học viên nộp bài.
  • Sửa đổi tuyến Chế độ xem của học viên trước đó để chấp nhận dữ liệu đầu vào của học viên.
  • Cung cấp tuyến đường để phân phát iframe Bài tập của học viên.

Sau khi hoàn tất, bạn có thể tạo tệp đính kèm dạng hoạt động trên bài tập thông qua giao diện người dùng của Google Lớp học khi đăng nhập với tư cách là giáo viên. Học viên trong lớp cũng có thể hoàn tất hoạt động trong iframe và gửi phản hồi. Giáo viên có thể xem bài tập mà học viên nộp trong giao diện người dùng chấm điểm của Lớp học.

Nhằm mục đích của ví dụ này, hãy sử dụng lại mẫu tệp đính kèm trong hướng dẫn trước đó, hiển thị hình ảnh của một điểm mốc nổi tiếng và chú thích kèm theo tên của điểm mốc đó. Hoạt động này bao gồm việc nhắc học viên cung cấp tên của điểm mốc.

Sửa đổi yêu cầu tạo tệp đính kèm

Chuyển đến phần mã mà bạn đã tạo tệp đính kèm thuộc loại nội dung trong hướng dẫn trước đó. Mục chính ở đây là một thực thể của đối tượng AddOnAttachment mà trước đây chúng ta đã chỉ định teacherViewUri, studentViewUrititle cho tệp đính kèm.

Mặc dù mọi tệp đính kèm của tiện ích bổ sung đều yêu cầu 3 trường này, nhưng sự có mặt hay không có studentWorkReviewUri sẽ xác định xem tệp đính kèm là loại hoạt động hay loại nội dung. Yêu cầu CREATEstudentWorkReviewUri được điền sẵn sẽ trở thành tệp đính kèm loại hoạt động, trong khi yêu cầu CREATE không có studentWorkReviewUri sẽ trở thành tệp đính kèm loại nội dung.

Hành động sửa đổi duy nhất đối với yêu cầu này là điền sẵn trường studentWorkReviewUri. Thêm một tuyến đường được đặt tên phù hợp tại đây; bạn sẽ triển khai tuyến này ở bước sau.

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.

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.
    # The presence of this field marks this as an activity-type attachment.
    "studentWorkReviewUri": {
        "uri":
            flask.url_for(
                "view_submission", _scheme='https', _external=True)
    },
    # The title of the attachment.
    "title": f"Attachment {attachment_count}",
}

Thêm bộ nhớ ổn định cho các tệp đính kèm loại nội dung

Ghi lại câu trả lời của học viên đối với hoạt động của chúng ta. Bạn có thể tra cứu sau khi giáo viên xem bài tập đã nộp trong iframe Bài tập của học viên.

Thiết lập giản đồ cơ sở dữ liệu cho Submission. Ví dụ được cung cấp của chúng ta yêu cầu học viên nhập tên của điểm mốc hiển thị trong hình ảnh. Do đó, Submission chứa các thuộc tính sau:

  • attachment_id: Giá trị nhận dạng duy nhất của tệp đính kèm. Do Lớp học chỉ định và trả về trong phản hồi khi tạo tệp đính kèm.
  • submission_id: Giá trị nhận dạng của bài tập học viên nộp. Do Lớp học chỉ định và trả về trong phản hồi getAddOnContext ở Chế độ xem của học viên.
  • student_response: Câu trả lời do học viên đưa ra.

Python

Mở rộng việc triển khai SQLite và flask_sqlalchemy từ các bước trước.

Chuyển đến tệp mà bạn đã xác định các bảng trước đó (models.py nếu bạn đang theo ví dụ của chúng tôi). Thêm phần sau đây ở cuối tệp.

# Database model to represent a student submission.
class Submission(db.Model):
    # The attachmentId is the unique identifier for the attachment.
    submission_id = db.Column(db.String(120), primary_key=True)

    # The unique identifier for the student's submission.
    attachment_id = db.Column(db.String(120), primary_key=True)

    # The student's response to the question prompt.
    student_response = db.Column(db.String(120))

Nhập lớp Submission mới vào tệp máy chủ bằng các tuyến xử lý tệp đính kèm của bạn.

Sửa đổi tuyến Chế độ xem của học viên

Tiếp theo, hãy sửa đổi tuyến Chế độ xem của học viên trước đó để cho thấy một biểu mẫu nhỏ và chấp nhận dữ liệu nhập từ học viên. Bạn có thể sử dụng lại hầu hết các mã trong hướng dẫn từng bước trước đó.

Tìm mã máy chủ cung cấp tuyến cho Khung hiển thị dành cho học viên. Đây là tuyến được chỉ định trong trường studentViewUri khi tạo tệp đính kèm. Thay đổi đầu tiên cần thực hiện là trích xuất submissionId từ phản hồi getAddOnContext.

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.

# Issue a request to the courseWork.getAddOnContext endpoint
addon_context_response = classroom_service.courses().courseWork(
).getAddOnContext(
    courseId=flask.session["courseId"],
    itemId=flask.session["itemId"]).execute()

# One of studentContext or teacherContext will be populated.
user_context = "student" if addon_context_response.get(
    "studentContext") else "teacher"

# If the user is a student...
if user_context == "student":
    # Extract the submissionId from the studentContext object.
    # This value is provided by Google Classroom.
    flask.session["submissionId"] = addon_context_response.get(
            "studentContext").get("submissionId")

Bạn cũng nên gửi yêu cầu để biết trạng thái nộp bài của học viên. Phản hồi chứa giá trị SubmissionState cho biết các trạng thái như học viên đã mở hay nộp tệp đính kèm. Cách này có thể hữu ích nếu bạn muốn không cho phép chỉnh sửa một bài tập đã nộp, hoặc nếu bạn muốn cung cấp thông tin chi tiết của giáo viên về tiến độ của học sinh:

Python

Trong ví dụ đã cung cấp của chúng tôi, đây là phần tiếp theo của phương thức load_activity_attachment ở trên.

# Issue a request to get the status of the student submission.
submission_response = classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().get(
    courseId=flask.session["courseId"],
    itemId=flask.session["itemId"],
    attachmentId=flask.session["attachmentId"],
    submissionId=flask.session["submissionId"]).execute()

Cuối cùng, hãy tìm nạp thông tin về tệp đính kèm từ cơ sở dữ liệu của chúng tôi và phân phát biểu mẫu nhập. Biểu mẫu trong ví dụ của chúng tôi bao gồm một trường nhập dữ liệu dạng chuỗi và một nút gửi. Hiện hình ảnh của điểm mốc và nhắc học viên nhập tên. Sau khi họ đưa ra phản hồi, hãy ghi lại phản hồi đó trong cơ sở dữ liệu của chúng tôi.

Python

Trong ví dụ đã cung cấp của chúng tôi, đây là phần tiếp theo của phương thức load_activity_attachment ở trên.

# Look up the attachment in the database.
attachment = Attachment.query.get(flask.session["attachmentId"])

message_str = f"I see that you're a {user_context}! "
message_str += (
    f"I've loaded the attachment with ID {attachment.attachment_id}. "
    if user_context == "teacher" else
    "Please complete the activity below.")

form = activity_form_builder()

if form.validate_on_submit():
    # Record the student's response in our database.

    # Check if the student has already submitted a response.
    # If so, update the response stored in the database.
    student_submission = Submission.query.get(flask.session["submissionId"])

    if student_submission is not None:
        student_submission.student_response = form.student_response.data
    else:
        # Store the student's response by the submission ID.
        new_submission = Submission(
            submission_id=flask.session["submissionId"],
            attachment_id=flask.session["attachmentId"],
            student_response=form.student_response.data)
        db.session.add(new_submission)

    db.session.commit()

    return flask.render_template(
        "acknowledge-submission.html",
        message="Your response has been recorded. You can close the " \
            "iframe now.",
        instructions="Please Turn In your assignment if you have " \
            "completed all tasks."
    )

# Show the activity.
return flask.render_template(
    "show-activity-attachment.html",
    message=message_str,
    image_filename=attachment.image_filename,
    image_caption=attachment.image_caption,
    user_context=user_context,
    form=form,
    responses=response_strings)

Để phân biệt giữa những người dùng, hãy cân nhắc tắt hàm gửi và thay vào đó, hiển thị câu trả lời đúng trong Chế độ xem của giáo viên.

Thêm một tuyến cho iframe Bài tập của học viên

Cuối cùng, hãy thêm một tuyến để phân phát iframe Bài tập của học viên. Tên của tuyến này phải khớp với tên được cung cấp cho studentWorkReviewUri khi tạo tệp đính kèm. Tuyến này sẽ mở ra khi giáo viên xem bài tập mà học viên nộp trong giao diện người dùng của tính năng chấm điểm trên Lớp học.

Bạn sẽ nhận được tham số truy vấn submissionId khi Lớp học mở iframe Bài tập của học viên. Hãy sử dụng công cụ này để truy xuất bài tập của học viên từ cơ sở dữ liệu cục bộ của bạn:

Python

Trong ví dụ chúng tôi cung cấp, phần phụ thuộc nằm trong tệp webapp/attachment_routes.py.

@app.route("/view-submission")
def view_submission():
    """
    Render a student submission using the show-student-submission.html template.
    """

    # Save the query parameters passed to the iframe in the session, just as we did
    # in previous routes. Abbreviated here for readability.
    add_iframe_query_parameters_to_session(flask.request.args)

    # For the sake of brevity in this example, we'll skip the conditional logic
    # to see if we need to authorize the user as we have done in previous steps.
    # We can assume that the user that reaches this route is a teacher that has
    # already authorized and created an attachment using the add-on.

    # In production, we recommend fully validating the user's authorization at
    # this stage as well.

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

    # Render the student's response alongside the correct answer.
    return flask.render_template(
        "show-student-submission.html",
        message=f"Loaded submission {student_submission.submission_id} for "\
            f"attachment {attachment.attachment_id}.",
        student_response=student_submission.student_response,
        correct_answer=attachment.image_caption)

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

Lặp lại Kiểm thử các bước sử dụng tiện ích bổ sung trong hướng dẫn từng bước trước đó. Bạn nên có một tệp đính kèm mà học viên có thể mở.

Hãy hoàn tất các bước sau để kiểm thử tệp đính kèm của hoạt động:

  • Đăng nhập vào Google Lớp học với tư cách là một trong những người dùng kiểm thử học viên trong cùng một lớp với người dùng kiểm thử cho giáo viên.
  • Chuyển đến thẻ Bài tập trên lớp và mở rộng bài kiểm tra Bài tập.
  • Nhấp vào thẻ tệp đính kèm của tiện ích bổ sung để mở Chế độ xem của học viên và gửi câu trả lời cho hoạt động đó.
  • Đóng iframe sau khi hoàn tất hoạt động. Nhấp vào nút Nộp bài (không bắt buộc).

Bạn sẽ không thấy có gì thay đổi trong Lớp học sau khi hoàn thành hoạt động đó. Bây giờ, hãy kiểm tra iframe Bài tập của học viên:

  • Đăng nhập vào Lớp học với tư cách là người dùng kiểm thử giáo viên.
  • Tìm cột cho bài kiểm tra của bạn trong thẻ Điểm. Nhấp vào tên của bài tập kiểm thử.
  • Tìm thẻ cho người dùng là học viên thử nghiệm. Nhấp vào tệp đính kèm trên thẻ.

Kiểm tra để đảm bảo học viên thấy bài nộp là chính xác.

Xin chúc mừng! Bạn đã sẵn sàng chuyển sang bước tiếp theo: đồng bộ hoá điểm của tệp đính kèm.