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

این پنجمین راهپیمایی در سریال Walkthrough در کلاس های افزودنی است.

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

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

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

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

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

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

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

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

به بخش کد خود بروید که در آن یک پیوست از نوع محتوا در Walkthrough قبلی ایجاد کرده اید. مورد کلیدی در اینجا نمونه‌ای از یک شی 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 را تغییر دهید

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

کد سروری را که مسیر را برای نمای دانشجویی شما فراهم می کند، پیدا کنید. این مسیری است که هنگام ایجاد ضمیمه در قسمت 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 هنگام ایجاد پیوست مطابقت داشته باشد. این مسیر زمانی باز می شود که معلم به ارائه دانش آموز در کلاس UI کلاس درس مراجعه کند.

هنگامی که کلاس باز می شود ، بررسی کار دانشجویی Iframe 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 کلیک کنید.

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

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

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

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