קבצים מצורפים מסוג פעילות

זוהי ההדרכה המפורטת החמישית בנושא תוספים ל-Classroom של הדרכות מפורטות.

בהדרכה המפורטת הזו משנים את הדוגמה מהשלב הקודם בהדרכה כדי ליצור קובץ מצורף של סוג פעילות. אלו הם קבצים מצורפים לדרוש מהתלמיד להגיש, כמו תשובה בכתב, בוחן שנוצר על ידי התלמידים.

חשוב להבדיל בין קבצים מצורפים מסוג תוכן לבין קבצים מצורפים מסוג פעילות. קבצים מצורפים מסוג פעילות שונים מסוגי התוכן באופנים הבאים:

  • "הגשה" מופיע בפינה הימנית העליונה של ה-iframe של תצוגת התלמידים.
  • הם מספקים מזהה ייחודי לעבודות של התלמידים.
  • הכרטיס המצורף יופיע בממשק המשתמש של התלמידים ב-Classroom.
  • הם יכולים להגדיר ציון למטלה שאליה הם שייכים.

תוכלו להיעזר בהדרכה המפורטת הבאה בנושא מתן ציונים. בתהליך הזה ההדרכה המפורטת תבצעו את הפעולות הבאות:

  • לשנות את הבקשות הקודמות ליצירת קבצים מצורפים Classroom API ליצירת קובץ מצורף עם סוג פעילות.
  • להטמיע אחסון מתמיד להגשות של תלמידים.
  • כדי לאשר קלט של תלמידים, צריך לשנות את המסלול הקודם בתצוגת התלמידים.
  • מציינים נתיב להצגת ה-iframe של הביקורת על עבודות התלמידים.

בסיום התהליך, אפשר ליצור קבצים מצורפים מסוג פעילות במטלות באמצעות את ממשק המשתמש של Google Classroom כשהם מחוברים כמורים. התלמידים בכיתה יכולים להשלים את הפעילות ב-iframe ולשלוח תשובה. המורה יכול/ה לראות את העבודה שהתלמיד או התלמידה הגישו בממשק המשתמש למתן ציונים של Classroom.

למטרות דוגמה זו, השתמש שוב בתבנית הקובץ המצורף ההדרכה המפורטת הקודמת שמציגה תמונה של ציון דרך מפורסם וכיתוב מופיע בשם של ציון הדרך. הפעילות כוללת הנחיות לתלמידים מוסיפים את השם של ציון הדרך.

שינוי הבקשה ליצירת הקובץ המצורף

עוברים לקטע בקוד שבו יצרתם סוג תוכן. בקובץ המצורף בהדרכה המפורטת הקודמת. הפריט העיקרי כאן הוא מופע של אובייקט AddOnAttachment שבו ציינת בעבר את teacherViewUri, studentViewUri ו-title לקובץ המצורף.

למרות שלכל הקבצים המצורפים של התוספים נדרשים שלושת השדות האלה, הנוכחות או היעדר studentWorkReviewUri קובע אם הקובץ המצורף סוג הפעילות או סוג התוכן. בקשת CREATE עם שדה מאוכלס הקובץ studentWorkReviewUri הופך לקובץ מצורף מסוג פעילות, ואילו CREATE בקשה בלי studentWorkReviewUri הופכת לקובץ מצורף מסוג תוכן.

השינוי היחיד שיש לבצע בבקשה הזו הוא לאכלס את שדה studentWorkReviewUri. צריך להוסיף כאן מסלול עם שם מתאים. עבורך וליישם אותה בשלב מאוחר יותר.

Python

בדוגמה שסופקה, הכתובת הזו היא ב-method 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: התשובה שסופקה על ידי התלמיד/ה.

Python

להרחיב את ההטמעה של 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 לקובץ השרת עם הקובץ המצורף במסלולים שונים.

שינוי הנתיב של תצוגת הסטודנטים

בשלב הבא, צריך לשנות את המסלול הקודם בתצוגת הסטודנטים כדי להציג טופס קטן ולאשר מידע מהתלמיד. אפשר להשתמש שוב ברוב הקוד הקודם בהדרכה מפורטת.

מאתרים את קוד השרת שמספק את הנתיב לתצוגה לתלמידים. הדבר המסלול שצוין בשדה studentViewUri במהלך יצירת קובץ מצורף. השינוי הראשון שצריך לבצע הוא לחלץ את submissionId מתוך תגובה אחת (getAddOnContext).

Python

בדוגמה שסופקה, זו השיטה 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, שמציין כזו אם התלמיד או התלמידה פתחו את הקובץ המצורף או הגישו אותו. למשל שימושיים אם רוצים למנוע עריכות בהגשה שהוגשה, או אם מעוניינים לספק למורים תובנות לגבי ביצועי התלמידים התקדמות:

Python

בדוגמה שלמעלה, זה השיטה 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()

לבסוף, מאחזרים את פרטי הקבצים המצורפים ממסד הנתונים שלנו וממלאים אותם הטופס הזה. הטופס בדוגמה שלמעלה מורכב משדה קלט שכולל מחרוזת לחצן שליחה. מציגים את התמונה של ציון הדרך ומבקשים מהתלמיד להזין את השם שלה. אחרי קבלת התשובה, צריך לתעד אותה במסד הנתונים שלנו.

Python

בדוגמה שלמעלה, זה השיטה 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 של הביקורת של עבודות התלמידים. השם של פריט זה המסלול צריך להתאים למסלול שצוין ל-studentWorkReviewUri במהלך היצירה קובץ מצורף. המסלול נפתח כשהמורה צופה בהגשה של התלמיד/ה ממשק המשתמש של הכיתה ב-Classroom.

הפרמטר של השאילתה submissionId מופיע כש-Classroom פתיחת ה-iframe של הביקורת על עבודות התלמידים. אפשר להשתמש בה כדי לאחזר עבודות של התלמיד/ה מסד הנתונים המקומי:

Python

בדוגמה שלנו, זה נמצא בקובץ 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. כאחד תלמיד/ה משתמש מבחן באותה כיתה כמו משתמש מבחן של מורה.
  • עוברים לכרטיסייה עבודות ומרחיבים את הבחינה מטלה.
  • לוחצים על הכרטיס המצורף של התוסף כדי לפתוח את התצוגה לתלמידים ולשלוח תגובה לפעילות.
  • בסיום הפעילות, סוגרים את ה-iframe. (אופציונלי) לוחצים על פנייה לחצן פנימי.

לא אמור לחול שינוי ב-Classroom אחרי שמסיימים הפעילות. עכשיו אפשר לבדוק את ה-iframe של הביקורת על עבודות התלמידים:

  • נכנסים ל-Classroom בתור משתמש הבדיקה של המורה.
  • מחפשים את העמודה של מטלה הבדיקה בכרטיסייה ציונים. לוחצים על השם של משימת הבחינה.
  • מאתרים את הכרטיס של התלמיד לבדיקה. לוחצים על הקובץ המצורף בכרטיס.

מוודאים שההגשה הנכונה מוצגת לתלמיד.

מעולה! אפשר להמשיך לשלב הבא: סנכרון הקובץ המצורף ציונים.