پیوست های نوع فعالیت

این پنجمین راهنما در مجموعه مروری بر افزونه‌های Classroom است.

در این راهنما، مثالی را از مرحله پیش‌بینی قبلی تغییر می‌دهید تا یک پیوست از نوع فعالیت تولید شود. این‌ها هر پیوستی هستند که نیاز به ارسال دانش‌آموز دارند، مانند پاسخ کتبی، مسابقه، یا سایر مصنوعات ایجاد شده توسط دانش‌آموز.

تمایز بین پیوست‌های نوع محتوا و نوع فعالیت مهم است. پیوست‌های نوع فعالیت به روش‌های زیر با نوع محتوا متفاوت هستند:

  • دکمه "Turn In" در سمت راست بالای iframe Student View ظاهر می شود.
  • آنها یک شناسه منحصر به فرد برای کار دانش آموز ارائه می دهند.
  • کارت پیوست آن‌ها در رابط کاربری کلاس روم نشان داده می‌شود.
  • آنها می توانند برای تکلیفی که به آن تعلق دارند نمره تعیین کنند.

برای بحث در مورد درجه بندی، راهنما بعدی را ببینید. در طول این راهنما موارد زیر را تکمیل می کنید:

  • درخواست‌های ایجاد پیوست قبلی را به API Classroom تغییر دهید تا یک پیوست از نوع فعالیت ایجاد کنید.
  • اجرای ذخیره سازی مداوم برای ارسالی دانش آموزان.
  • مسیر قبلی نمای دانشجویی را تغییر دهید تا ورودی دانش‌آموز را بپذیرید.
  • مسیری برای ارائه iframe بررسی کار دانشجویی ارائه دهید.

پس از اتمام، می‌توانید هنگام ورود به عنوان معلم، پیوست‌هایی از نوع فعالیت در تکالیف از طریق رابط کاربری Google Classroom ایجاد کنید. دانش‌آموزان کلاس نیز می‌توانند فعالیت را در iframe تکمیل کرده و پاسخ ارسال کنند. معلم می‌تواند موارد ارسالی دانش‌آموز را در رابط کاربری درجه‌بندی Classroom مشاهده کند.

برای اهداف این مثال، از الگوی پیوست از مرحله پیشین استفاده مجدد کنید که تصویری از یک نقطه عطف معروف و شرحی با نام علامت مشخصه را نشان می‌دهد. این فعالیت شامل ترغیب دانش آموز برای ارائه نام نقطه عطف است.

درخواست ایجاد پیوست را اصلاح کنید

به بخشی از کد خود بروید که در آن یک پیوست از نوع محتوا را در مرحله پیشین ایجاد کرده اید. مورد کلیدی در اینجا نمونه‌ای از یک شی AddOnAttachment است که قبلا teacherViewUri ، studentViewUri و title برای پیوست مشخص کرده‌ایم.

در حالی که همه پیوست‌های افزودنی به این سه فیلد نیاز دارند، وجود یا عدم وجود studentWorkReviewUri تعیین می‌کند که پیوست از نوع فعالیت یا محتوا باشد. یک درخواست CREATE با یک studentWorkReviewUri پر شده تبدیل به یک پیوست از نوع فعالیت می شود، در حالی که یک درخواست CREATE بدون studentWorkReviewUri به یک پیوست از نوع محتوا تبدیل می شود.

تنها تغییری که باید در این درخواست انجام شود پر کردن فیلد studentWorkReviewUri است. یک مسیر با نام مناسب را در اینجا اضافه کنید. شما آن را در مرحله بعد اجرا می کنید.

پایتون

در مثال ارائه شده ما، این در روش create_attachments در فایل 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}",
}

ذخیره سازی دائمی برای پیوست های نوع محتوا اضافه کنید

پاسخ دانش آموز به فعالیت ما را ثبت کنید. می‌توانید بعداً وقتی معلم ارسالی را در iframe بررسی کار دانشجویی مشاهده کرد، آن را جستجو کنید.

یک طرح پایگاه داده برای Submission تنظیم کنید. مثال ارائه شده ما از دانش آموزان انتظار دارد که نام نقطه عطف نشان داده شده در یک تصویر را وارد کنند. بنابراین یک Submission حاوی ویژگی های زیر است:

  • attachment_id : یک شناسه منحصر به فرد برای پیوست. توسط Classroom تخصیص داده شد و در هنگام ایجاد پیوست در پاسخ بازگردانده شد.
  • submission_id : یک شناسه برای ارسال دانشجو. توسط Classroom اختصاص داده شد و در پاسخ getAddOnContext در نمای دانشجو بازگردانده شد.
  • student_response : پاسخ ارائه شده توسط دانشجو.

پایتون

اجرای SQLite و flask_sqlalchemy را از مراحل قبل گسترش دهید.

به فایلی بروید که در آن جداول قبلی را تعریف کرده اید (اگر از مثال ارائه شده ما پیروی می کنید models.py ). موارد زیر را در پایین فایل اضافه کنید.

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

کلاس Submission جدید را با مسیرهای مدیریت پیوست خود به فایل سرور وارد کنید.

مسیر Student View را تغییر دهید

سپس، مسیر قبلی Student View را تغییر دهید تا یک فرم کوچک نشان داده شود و ورودی دانش‌آموز را بپذیرید. می‌توانید از بیشتر کدهای پیش‌فرض قبلی دوباره استفاده کنید.

کد سروری را که مسیر را برای نمای دانشجویی شما فراهم می کند، پیدا کنید. این مسیری است که در قسمت studentViewUri هنگام ایجاد یک پیوست مشخص شده است. اولین تغییری که باید انجام دهید استخراج submissionId از پاسخ getAddOnContext است.

پایتون

در مثال ارائه شده ما، این در روش load_activity_attachment در فایل 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")

همچنین ممکن است بخواهید درخواستی برای دریافت وضعیت ارسال دانشجو صادر کنید. پاسخ حاوی یک مقدار SubmissionState است که وضعیت‌هایی را نشان می‌دهد مانند اینکه آیا دانش‌آموز پیوست را باز کرده است یا آن را تحویل داده است. اگر نمی‌خواهید ویرایش‌های ارسالی ارائه‌شده را مجاز نکنید، یا اگر علاقه‌مند به ارائه معلم هستید، ممکن است مفید باشد. بینش پیشرفت دانش آموزان خود:

پایتون

در مثال ارائه شده ما، این ادامه روش load_activity_attachment بالا است.

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

در نهایت، اطلاعات پیوست را از پایگاه داده ما واکشی کنید و یک فرم ورودی ارائه دهید. فرم در مثال ارائه شده ما شامل یک فیلد ورودی رشته و یک دکمه ارسال است. تصویر نقطه عطف را نشان دهید و از دانش آموز بخواهید نام آن را وارد کند. پس از ارائه پاسخ، آن را در پایگاه داده ما ثبت کنید.

پایتون

در مثال ارائه شده ما، این ادامه روش load_activity_attachment بالا است.

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

برای تمایز بین کاربران، عملکرد ارسال را غیرفعال کنید و در عوض پاسخ صحیح را در نمای معلم نشان دهید.

یک مسیر برای iframe بررسی کار دانشجویی اضافه کنید

در نهایت، یک مسیر برای ارائه iframe Student Work Review اضافه کنید. نام این مسیر باید با نام ارائه شده برای studentWorkReviewUri هنگام ایجاد پیوست مطابقت داشته باشد. این مسیر زمانی باز می شود که معلم مطالب ارسالی دانش آموز را در رابط کاربری کلاس درس مشاهده کند.

وقتی Classroom iframe Student Work Review را باز می‌کند، پارامتر query submissionId را دریافت می‌کنید. از آن برای بازیابی کار دانش آموز از پایگاه داده محلی خود استفاده کنید:

پایتون

در مثال ارائه شده ما، این در فایل 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)

افزونه را تست کنید

آزمایش مراحل افزودنی مربوط به مرحله پیشین را تکرار کنید. شما باید پیوستی داشته باشید که دانش آموز بتواند آن را باز کند.

مراحل زیر را برای آزمایش پیوست فعالیت انجام دهید:

  • به عنوان یکی از کاربران آزمون دانش آموز خود در همان کلاس با کاربر آزمون معلم وارد Google Classroom شوید.
  • به برگه Classwork بروید و تکلیف آزمایشی را گسترش دهید.
  • برای باز کردن نمای دانشجو و ارسال پاسخ برای فعالیت ، روی کارت پیوست افزودنی کلیک کنید.
  • پس از اتمام فعالیت، iframe را ببندید. در صورت تمایل، روی دکمه Turn In کلیک کنید.

پس از تکمیل فعالیت، نباید تغییری در Classroom مشاهده کنید. اکنون iframe بررسی کار دانشجویی را آزمایش کنید:

  • به عنوان کاربر آزمون معلم وارد Classroom شوید.
  • ستون مربوط به تکلیف آزمون خود را در برگه نمرات پیدا کنید. روی نام تکلیف آزمون خود کلیک کنید.
  • کارت کاربر دانشجوی آزمون را پیدا کنید. روی پیوست روی کارت کلیک کنید.

تأیید کنید که ارسال صحیح برای دانش آموز ظاهر می شود.

تبریک می گویم! برای ادامه مرحله بعدی آماده هستید: همگام سازی نمرات پیوست .