गतिविधि-प्रकार अटैचमेंट

यह Classroom के ऐड-ऑन के बारे में जानकारी देने वाली सीरीज़ का पांचवां वॉकथ्रू है.

इस वॉकट्रू में, पिछले वॉकट्रू चरण के उदाहरण में बदलाव करके, गतिविधि के टाइप का अटैचमेंट बनाया जाता है. ये ऐसे अटैचमेंट होते हैं जिन्हें छात्र-छात्राओं को सबमिट करना होता है. जैसे, लिखित जवाब, क्विज़ या छात्र-छात्राओं के बनाए गए अन्य आइटम.

कॉन्टेंट टाइप और गतिविधि टाइप के अटैचमेंट के बीच अंतर करना ज़रूरी है. गतिविधि के टाइप के हिसाब से अटैचमेंट, कॉन्टेंट के टाइप के हिसाब से अटैचमेंट से इन मामलों में अलग होते हैं:

  • छात्र-छात्राओं के व्यू वाले iframe में सबसे ऊपर दाईं ओर, "सबमिट करें" बटन दिखता है.
  • ये छात्र-छात्राओं के काम के लिए यूनीक आइडेंटिफ़ायर उपलब्ध कराते हैं.
  • उनका अटैचमेंट कार्ड, Classroom के ग्रेड देने वाले यूज़र इंटरफ़ेस (यूआई) में दिखता है.
  • वे उस असाइनमेंट के लिए ग्रेड सेट कर सकते हैं जो उन्हें असाइन किया गया है.

ग्रेडिंग के बारे में जानने के लिए, अगला वॉकट्रू देखें. इस वॉक्थ्रू के दौरान, आपको ये काम करने होंगे:

  • गतिविधि के टाइप वाला अटैचमेंट बनाने के लिए, Classroom API को अटैचमेंट बनाने के पिछले अनुरोधों में बदलाव करें.
  • छात्र-छात्राओं के सबमिट किए गए असाइनमेंट के लिए, स्थायी स्टोरेज लागू करें.
  • छात्र-छात्राओं के इनपुट को स्वीकार करने के लिए, छात्र-छात्राओं के व्यू वाले पिछले रूट में बदलाव करें.
  • छात्र-छात्राओं के काम की समीक्षा करने वाले iframe को दिखाने के लिए, एक रूट उपलब्ध कराएं.

इसके बाद, शिक्षक के तौर पर लॉग इन करके, Google Classroom के यूज़र इंटरफ़ेस (यूआई) के ज़रिए असाइनमेंट में गतिविधि वाले अटैचमेंट बनाए जा सकते हैं. क्लास के छात्र-छात्राएं, iframe में मौजूद गतिविधि को पूरा करके जवाब सबमिट कर सकते हैं. शिक्षक, Classroom के ग्रेडिंग यूज़र इंटरफ़ेस (यूआई) में छात्र-छात्रा के सबमिट किए गए असाइनमेंट को देख सकता है.

इस उदाहरण के लिए, पिछले वॉकट्रू में इस्तेमाल किए गए अटैचमेंट टेंप्लेट का फिर से इस्तेमाल करें. इसमें एक मशहूर जगह की इमेज और उस जगह के नाम वाला कैप्शन दिखाया गया है. इस गतिविधि में, छात्र या छात्रा को लैंडमार्क का नाम बताने के लिए कहा जाता है.

अटैचमेंट बनाने के अनुरोध में बदलाव करना

अपने कोड के उस सेक्शन पर जाएं जिसमें आपने पिछले वॉकट्रू में कॉन्टेंट-टाइप अटैचमेंट बनाया था. यहां मुख्य आइटम, AddOnAttachment ऑब्जेक्ट का एक इंस्टेंस है. इसमें हमने अटैचमेंट के लिए, teacherViewUri, studentViewUri, और title की जानकारी पहले ही दे दी थी.

सभी ऐड-ऑन अटैचमेंट के लिए इन तीन फ़ील्ड की ज़रूरत होती है. हालांकि, studentWorkReviewUri की मौजूदगी या गैर-मौजूदगी से यह तय होता है कि अटैचमेंट, गतिविधि के टाइप का है या कॉन्टेंट के टाइप का. CREATE के साथ की गई studentWorkReviewUri वाली क्वेरी, गतिविधि के टाइप का अटैचमेंट बन जाती है. वहीं, CREATE के साथ की गई studentWorkReviewUri वाली क्वेरी, कॉन्टेंट के टाइप का अटैचमेंट बन जाती है.

इस अनुरोध में सिर्फ़ studentWorkReviewUri फ़ील्ड में वैल्यू डाली जा सकती है. यहां सही नाम वाला कोई रूट जोड़ें. इसे बाद के चरण में लागू करें.

Python

हमारे दिए गए उदाहरण में, यह 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 फ़ील्ड में दिया गया रूट है. सबसे पहले, getAddOnContext जवाब से submissionId को एक्सट्रैक्ट करें.

Python

हमारे दिए गए उदाहरण में, यह load_activity_attachment फ़ाइल में 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 grader के यूज़र इंटरफ़ेस (यूआई) में छात्र-छात्रा का सबमिशन देखता है.

जब Classroom, छात्र-छात्रा के काम की समीक्षा करने वाला iframe खोलता है, तब आपको submissionId क्वेरी पैरामीटर मिलता है. इसका इस्तेमाल करके, अपने लोकल डेटाबेस से छात्र-छात्राओं का काम वापस पाएं:

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 में साइन इन करें.
  • ग्रेड टैब में, टेस्ट असाइनमेंट का कॉलम ढूंढें. अपने टेस्ट असाइनमेंट के नाम पर क्लिक करें.
  • टेस्ट स्टूडेंट के उपयोगकर्ता के लिए कार्ड ढूंढें. कार्ड पर मौजूद अटैचमेंट पर क्लिक करें.

पुष्टि करें कि छात्र-छात्रा के लिए सही सबमिशन दिख रहा हो.

बधाई हो! अब आप अगले चरण पर जा सकते हैं: अटैचमेंट के ग्रेड सिंक करना.