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

Đây là hướng dẫn từng bước thứ năm trong loạt hướng dẫn từng bước về tiện ích bổ sung trên Google Lớp họ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 loại hoạt động. Đây là mọi tệp đính kèm mà học viên phải nộp, 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.
  • 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 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 đối với API Lớp học để tạo tệp đính kèm 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. Sinh viên trong lớp này 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.

Để phục vụ cho 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 của một mốc nổi tiếng và chú thích có tên của điểm 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 tệp đính kèm loại nội dung trong phần hướng dẫn từng bước trước đó. Mục khoá ở đây là một thực thể 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ả tiện ích bổ sung đính kèm đều yêu cầu 3 trường này, nhưng sự hiện diện 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 đã điền sẽ trở thành tệp đính kèm dạng hoạt động, trong khi yêu cầu CREATE 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 vào trường studentWorkReviewUri. Thêm một tuyến đường được đặt tên thích hợp tại đây; bạn sẽ triển khai tuyến đường này ở bước sau.

Python

Trong ví dụ mà chúng tôi cung cấp, thao tá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ớ 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 yêu cầu học viên nhập tên của 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 một 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 bài tập mà 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 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ụ được cung cấp của chúng tôi). Thêm nội dung sau vào 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ủ với các tuyến xử lý tệp đính kèm của bạn.

Sửa đổi tuyến đường 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 đó để hiển thị 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 mã từ hướng dẫn trướ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 một 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ụ mà chúng tôi cung cấp, thao tá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 để 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ư 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 bài tập đã nộp, hoặc nếu bạn muốn cung cấp cho giáo viên thông tin chi tiết về tình hình học tập của học sinh:

Python

Trong ví dụ được cung cấp, đâ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 ta và phân phát biểu mẫu nhập dữ liệu. Biểu mẫu trong ví dụ mà chúng tôi cung cấp bao gồm một trường nhập dữ liệu chuỗi và một nú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ụ được cung cấp, đâ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 người dùng, hãy cân nhắc tắt hàm gửi và hiện 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 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 học viên đã nộp trong giao diện người dùng của công cụ chấm điểm của Lớp học.

Bạn sẽ nhận được tham số truy vấn submissionId khi Lớp học mở iframe để đánh giá 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ụ đã 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 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 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ẻ tệp đính kèm của tiện ích bổ sung để mở Chế độ xem của học viên rồi gửi phản hồi cho hoạt động đó.
  • Hãy đóng iframe sau khi hoàn tất hoạt động. Nhấp vào nút Nộp bài (nếu muốn).

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 này. 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 của bài tập kiểm thử.
  • 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á cấp độ tệp đính kèm.