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

Đây là hướng dẫn hướng dẫn thứ năm về các tiện ích bổ sung cho Google Lớp học loạt video hướng dẫn từng bước.

Trong phần hướng dẫn từng bước này, bạn sửa đổi ví dụ từ bước hướng dẫn từng bước trước đó để tạo một tệp đính kèm dạng hoạt động. Đây là bất kỳ tệp đính kèm nào yêu cầu học sinh nộp bài, chẳng hạn như trả lời bằng văn bản, bài kiểm tra hoặc cấu phần phần mềm 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ộp bài" sẽ xuất hiện ở trên cùng bên phải của iframe Chế độ xem của sinh viên.
  • Mã này cung cấp giá trị nhận dạng riêng biệt cho bài tập của học viên.
  • Thẻ tệp đính kèm của học viên sẽ xuất hiện trong giao diện người dùng của công cụ chấm điểm của Lớp học.
  • Họ có thể đặt điểm cho bài tập mà họ thuộc về.

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 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 đó thành API Lớp học để tạo tệp đính kèm theo loại hoạt động.
  • Triển khai bộ nhớ liên tục cho bài làm học viên đã nộp.
  • Sửa đổi tuyến trước Chế độ xem của học viên để chấp nhận hoạt động đầu vào của học viên.
  • Cung cấp một tuyến để phân phát iframe cho Bài đánh giá 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ó thể đồng thời hoàn tất hoạt động trong iframe rồi 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.

Trong ví dụ này, hãy sử dụng lại mẫu tệp đính kèm từ hướng dẫn từng bước trước đó cho thấy hình ảnh về một địa danh nổi tiếng cùng với chú thích bằng tên của mốc. Hoạt động bao gồm việc nhắc học viên cung cấp tên của 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 loại nội dung tệp đính kèm trong hướng dẫn từng bước trước đó. Mục quan trọng ở đây là một phiên bản của Đối tượng AddOnAttachment mà trước đó chúng ta đã chỉ định teacherViewUri, studentViewUrititle cho tệp đính kèm.

Mặc dù tất cả tệp đính kèm bằng tiện ích bổ sung đều yêu cầu 3 trường này, nhưng sự hiện diện hoặc việc không có studentWorkReviewUri sẽ xác định liệu tệp đính kèm có loại hoạt động hoặc loại nội dung. Yêu cầu CREATE có điền sẵn studentWorkReviewUri trở thành tệp đính kèm loại hoạt động, trong khi CREATE yêu cầu không có studentWorkReviewUri sẽ trở thành tệp đính kèm dạng nội dung.

Cách sửa đổi duy nhất đối với yêu cầu này là điền Trường studentWorkReviewUri. Thêm tuyến đường được đặt tên thích hợp tại đây; bạn hãy triển khai nó ở bước sau.

Python

Trong ví dụ mà chúng tôi cung cấp, đây là trong phương thức create_attachments trong 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ớ cố định cho các tệp đính kèm dạng nội dung

Ghi lại phản hồ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 Đánh giá 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ụ do chúng tôi cung cấp kỳ vọng học sinh nhập tên mốc hiển thị trong hình ảnh. Một Submission do đó chứa các thuộc tính sau:

  • attachment_id: Giá trị nhận dạng duy nhất của một tệp đính kèm. Người giao Lớp học và được trả về trong phản hồi khi tạo một tệp đính kèm.
  • submission_id: Giá trị nhận dạng bài tập mà học viên đã nộp. Người giao Lớp học và đã trả về trong phản hồi getAddOnContext trong 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 quy trình 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 làm theo ví dụ mà chúng tôi cung cấp). Thêm mã sau tại 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ủ cùng với tệp đính kèm xử lý các tuyến đường.

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

Tiếp theo, hãy sửa đổi tuyến đường Chế độ xem của học viên trước đó để hiển thị một biểu mẫu nhỏ rồi chấp nhận thông tin đầu vào từ học viên. Bạn có thể sử dụng lại hầu hết mã từ hướng dẫn từng bước.

Tìm mã máy chủ cung cấp tuyến đường cho Chế độ xem 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ừ getAddOnContext phản hồi.

Python

Trong ví dụ mà chúng tôi cung cấp, đây là 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 để xem 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ư vậy như học viên đã mở hay nộp tệp đính kèm. Thông tin này có thể là hữu ích nếu bạn muốn không cho phép chỉnh sửa nội dung mà người dùng đã gửi hoặc nếu bạn muốn cung cấp cho giáo viên thông tin chi tiết về học sinh tiến trình:

Python

Trong ví dụ đã cung cấp, đây là phần tiếp theo của 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, tìm nạp thông tin tệp đính kèm từ cơ sở dữ liệu của chúng ta rồi phân phát dữ liệu đầu vào biểu mẫu. Biểu mẫu trong ví dụ mà chúng ta đã cung cấp bao gồm một trường nhập dữ liệu chuỗi và một gửi. Cho hiện hình ảnh về 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 đó vào cơ sở dữ liệu của chúng tôi.

Python

Trong ví dụ đã cung cấp, đây là phần tiếp theo của 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 người dùng, hãy cân nhắc tắt tính năng gửi và thay vào đó sẽ hiển thị câu trả lời đúng trong Chế độ xem dành cho giáo viên.

Thêm một tuyến cho iframe cho bài đánh giá 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 Đánh giá bài tập của học viên. Tên của sự kiện tuyến phải khớp với tuyến được cung cấp cho studentWorkReviewUri khi tạo một tệp đính kèm. Lộ trình này sẽ mở ra khi giáo viên xem bài tập học sinh nộp giao diện người dùng của công cụ 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 để xem lại bài tập của học viên. Hãy sử dụng ứng dụng 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ụ đã cung cấp, chúng 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 quy trình Kiểm thử các bước của tiện ích bổ sung trong phần 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 tra tệp đính kèm hoạt động:

  • Đăng nhập vào Google Lớp học là một trong những học viên kiểm tra người dùng trong cùng một lớp với người dùng bài kiểm tra của 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ẻ đính kèm tiện ích bổ sung để mở Chế độ xem dành cho học viên rồi gửi cho hoạt động.
  • Hãy đóng iframe sau khi hoàn tất hoạt động. (Không bắt buộc) Nhấp vào nút Turn Trong.

Bạn sẽ không thấy bất cứ thay đổi gì trong Lớp học sau khi hoàn thành hoạt động đó. Bây giờ, hãy kiểm tra iframe cho Bài đánh giá 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 bài kiểm tra của giáo viên.
  • Tìm cột của bài tập kiểm tra trong thẻ Điểm. Nhấp vào tên bài tập kiểm tra của bạn.
  • Tìm thẻ cho người dùng 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 đã nộp bài đúng.

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