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

זוהי ההדרכה המפורטת החמישית בסדרת ההדרכה המפורטת על תוספים ל-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

בדוגמה שלמעלה, הכתובת היא ב-method 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

בדוגמה שלמעלה, זה המשך של ה-method 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

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

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

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