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

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

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

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