अटैचमेंट ग्रेड और ग्रेड पासबैक

यह Classroom ऐड-ऑन के बारे में जानकारी देने वाली सीरीज़ का छठा लेख है.

इस लेख में, ग्रेड की जा सकने वाली गतिविधि वाले अटैचमेंट को बनाने के लिए, पिछले लेख में दिए गए उदाहरण में बदलाव किया गया है. इसमें, प्रोग्राम के ज़रिए Google Classroom को ग्रेड वापस भेजा जाता है. यह ग्रेड, शिक्षक की ग्रेडबुक में ड्राफ़्ट ग्रेड के तौर पर दिखता है.

इस लेख में, Classroom को ग्रेड वापस भेजने के दो तरीके बताए गए हैं. इसलिए, यह लेख इस सीरीज़ के अन्य लेखों से थोड़ा अलग है. इन दोनों तरीकों से, डेवलपर और उपयोगकर्ता के अनुभव पर अलग-अलग असर पड़ता है. इसलिए, Classroom के लिए ऐड-ऑन डिज़ाइन करते समय, इन दोनों तरीकों को ध्यान में रखें. लागू करने के विकल्पों के बारे में ज़्यादा जानने के लिए, हमारे अटैचमेंट के साथ इंटरैक्ट करना गाइड पेज पढ़ें.

ध्यान दें कि एपीआई में ग्रेडिंग की सुविधाएं ज़रूरी नहीं हैं. इन सुविधाओं का इस्तेमाल, गतिविधि वाले किसी भी अटैचमेंट के साथ किया जा सकता है.

इस लेख में, आपको ये काम करने होंगे:

  • Classroom API को अटैचमेंट बनाने के लिए भेजे गए पिछले अनुरोधों में बदलाव करना, ताकि अटैचमेंट के लिए ग्रेड का डिनॉमिनेटर भी सेट किया जा सके.
  • प्रोग्राम के ज़रिए, छात्र-छात्रा के सबमिशन को स्कोर करना और अटैचमेंट के लिए ग्रेड का न्यूमरेटर सेट करना.
  • साइन इन किए हुए या ऑफ़लाइन शिक्षक क्रेडेंशियल का इस्तेमाल करके, सबमिशन का ग्रेड Classroom को भेजने के दो तरीके लागू करना.

ये तरीके लागू करने के बाद, ग्रेड Classroom की ग्रेडबुक में दिखते हैं. इसके लिए, पासबैक के व्यवहार को ट्रिगर करना होता है. यह कब होता है, यह लागू करने के तरीके पर निर्भर करता है.

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

Classroom ऐड-ऑन के एपीआई में ग्रेडिंग की सुविधा को समझना

आपका ऐड-ऑन, किसी अटैचमेंट के लिए ग्रेड का न्यूमरेटर और डिनॉमिनेटर, दोनों सेट कर सकता है. इन्हें एपीआई में, क्रमशः pointsEarned और maxPoints वैल्यू का इस्तेमाल करके सेट किया जाता है. Classroom के यूज़र इंटरफ़ेस (यूआई) में, अटैचमेंट कार्ड पर maxPoints वैल्यू तब दिखती है, जब इसे सेट किया गया हो.

एक असाइनमेंट में, ज़्यादा से ज़्यादा पॉइंट वाले एक से ज़्यादा अटैचमेंट का उदाहरण

पहली इमेज. असाइनमेंट बनाने के यूज़र इंटरफ़ेस (यूआई) में, ऐड-ऑन के तीन अटैचमेंट कार्ड दिख रहे हैं. इनमें maxPoints सेट किया गया है.

Classroom ऐड-ऑन के एपीआई की मदद से, अटैचमेंट के ग्रेड के लिए सेटिंग कॉन्फ़िगर की जा सकती हैं और मिले हुए स्कोर को सेट किया जा सकता है. ये ग्रेड, असाइनमेंट के ग्रेड से अलग होते हैं. हालांकि, असाइनमेंट के ग्रेड की सेटिंग, उस अटैचमेंट के ग्रेड की सेटिंग के हिसाब से होती है जिसके अटैचमेंट कार्ड पर ग्रेड सिंक लेबल लगा होता है. जब "ग्रेड सिंक" वाला अटैचमेंट, छात्र-छात्रा के सबमिशन के लिए pointsEarned सेट करता है, तो वह असाइनमेंट के लिए छात्र-छात्रा का ड्राफ़्ट ग्रेड भी सेट करता है.

आम तौर पर, असाइनमेंट में जोड़ा गया पहला अटैचमेंट, जिसके लिए maxPoints सेट किया गया है, उसे "ग्रेड सिंक" लेबल मिलता है. "ग्रेड सिंक" लेबल का उदाहरण देखने के लिए, पहली इमेज में दिखाया गया असाइनमेंट बनाने के यूज़र इंटरफ़ेस (यूआई) का उदाहरण देखें. ध्यान दें कि "अटैचमेंट 1" कार्ड पर "ग्रेड सिंक" लेबल लगा है और लाल बॉक्स में असाइनमेंट का ग्रेड, 50 पॉइंट पर अपडेट किया गया है. यह भी ध्यान दें कि पहली इमेज में, ऐड-ऑन के तीन अटैचमेंट कार्ड दिख रहे हैं. हालांकि, सिर्फ़ एक कार्ड पर "ग्रेड सिंक" लेबल लगा है. यह मौजूदा तरीके की एक अहम सीमा है: सिर्फ़ एक अटैचमेंट पर "ग्रेड सिंक" लेबल लगाया जा सकता है.

अगर एक से ज़्यादा अटैचमेंट के लिए maxPoints सेट किया गया है, तो "ग्रेड सिंक" वाला अटैचमेंट हटाने पर, बाकी बचे अटैचमेंट पर "ग्रेड सिंक" की सुविधा चालू नहीं होती. maxPoints सेट करने वाला कोई दूसरा अटैचमेंट जोड़ने पर, नए अटैचमेंट पर ग्रेड सिंक की सुविधा चालू हो जाती है. साथ ही, असाइनमेंट का ज़्यादा से ज़्यादा ग्रेड, नए अटैचमेंट के हिसाब से बदल जाता है. ऐसा कोई तरीका नहीं है जिससे प्रोग्राम के ज़रिए यह देखा जा सके कि किस अटैचमेंट पर "ग्रेड सिंक" लेबल लगा है. साथ ही, यह भी नहीं देखा जा सकता कि किसी असाइनमेंट में कितने अटैचमेंट हैं.

किसी अटैचमेंट के लिए ज़्यादा से ज़्यादा ग्रेड सेट करना

इस सेक्शन में, अटैचमेंट के ग्रेड के लिए डिनॉमिनेटर सेट करने का तरीका बताया गया है. इसका मतलब है कि सबमिशन के लिए, सभी छात्र-छात्राओं को ज़्यादा से ज़्यादा कितने नंबर मिल सकते हैं. इसके लिए, अटैचमेंट की maxPoints वैल्यू सेट करें.

ग्रेडिंग की सुविधाएं चालू करने के लिए, मौजूदा तरीके में थोड़ा बदलाव करना ज़रूरी है. अटैचमेंट बनाते समय, maxPoints वैल्यू को उसी AddOnAttachment ऑब्जेक्ट में जोड़ें जिसमें studentWorkReviewUri, teacherViewUri, और अटैचमेंट के अन्य फ़ील्ड शामिल होते हैं.

ध्यान दें कि नए असाइनमेंट के लिए, ज़्यादा से ज़्यादा स्कोर डिफ़ॉल्ट रूप से 100 होता है. हमारा सुझाव है कि maxPoints को 100 के अलावा कोई दूसरी वैल्यू सेट करें, ताकि यह पुष्टि की जा सके कि ग्रेड सही तरीके से सेट किए जा रहे हैं. उदाहरण के तौर पर, maxPoints को 50 पर सेट करें:

Python

attachment ऑब्जेक्ट बनाते समय maxPoints फ़ील्ड जोड़ें, courses.courseWork.addOnAttachments एंडपॉइंट को CREATE अनुरोध भेजने से ठीक पहले. अगर आपने हमारे दिए गए उदाहरण का इस्तेमाल किया है, तो यह 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.
    "studentWorkReviewUri": {
        "uri":
            flask.url_for(
                "view_submission", _scheme='https', _external=True)
    },
    # Sets the maximum points that a student can earn for this activity.
    # This is the denominator in a fractional representation of a grade.
    "maxPoints": 50,
    # The title of the attachment.
    "title": f"Attachment {attachment_count}",
}

इस उदाहरण के लिए, maxPoints वैल्यू को अपने लोकल अटैचमेंट डेटाबेस में भी सेव करें. इससे, छात्र-छात्राओं के सबमिशन को ग्रेड करते समय, बाद में एपीआई को एक और कॉल करने की ज़रूरत नहीं पड़ेगी. हालांकि, ध्यान दें कि ऐसा हो सकता है कि शिक्षक, आपके ऐड-ऑन से अलग, असाइनमेंट के ग्रेड की सेटिंग में बदलाव करें. असाइनमेंट के लेवल पर maxPoints वैल्यू देखने के लिए, courses.courseWork एंडपॉइंट को GET अनुरोध भेजें. ऐसा करते समय, CourseWork.id फ़ील्ड में itemId पास करें.

अब अपने डेटाबेस मॉडल को अपडेट करें, ताकि इसमें अटैचमेंट की maxPoints वैल्यू भी सेव की जा सके. हमारा सुझाव है कि CREATE के जवाब में मिली maxPoints वैल्यू का इस्तेमाल करें:

Python

सबसे पहले, Attachment टेबल में max_points फ़ील्ड जोड़ें. अगर आपने हमारे दिए गए उदाहरण का इस्तेमाल किया है, तो यह webapp/models.py फ़ाइल में देखा जा सकता है.

# Database model to represent an attachment.
class Attachment(db.Model):
    # The attachmentId is the unique identifier for the attachment.
    attachment_id = db.Column(db.String(120), primary_key=True)

    # The image filename to store.
    image_filename = db.Column(db.String(120))

    # The image caption to store.
    image_caption = db.Column(db.String(120))

    # The maximum number of points for this activity.
    max_points = db.Column(db.Integer)

courses.courseWork.addOnAttachments के CREATE अनुरोध पर वापस जाएं. जवाब में मिली maxPoints वैल्यू को सेव करें.

new_attachment = Attachment(
    # The new attachment's unique ID, returned in the CREATE response.
    attachment_id=resp.get("id"),
    image_filename=key,
    image_caption=value,
    # Store the maxPoints value returned in the response.
    max_points=int(resp.get("maxPoints")))
db.session.add(new_attachment)
db.session.commit()

अब अटैचमेंट के लिए ज़्यादा से ज़्यादा ग्रेड सेट हो गया है. अब आपको इस सुविधा की जांच करनी चाहिए. इसके लिए, किसी नए असाइनमेंट में एक अटैचमेंट जोड़ें. इसके बाद, देखें कि अटैचमेंट कार्ड पर "ग्रेड सिंक" लेबल दिखता है या नहीं. साथ ही, देखें कि असाइनमेंट की "पॉइंट" वैल्यू बदलती है या नहीं.

Classroom में, छात्र-छात्रा के सबमिशन के लिए ग्रेड सेट करना

इस सेक्शन में, अटैचमेंट के ग्रेड के लिए न्यूमरेटर सेट करने का तरीका बताया गया है. इसका मतलब है कि किसी छात्र या छात्रा को अटैचमेंट के लिए कितने नंबर मिले हैं. इसके लिए, छात्र-छात्रा के अटैचमेंट सबमिशन की pointsEarned वैल्यू सेट करें.

अब आपको एक अहम फ़ैसला लेना है: आपका ऐड-ऑन, सेट करने के लिए अनुरोध कैसे भेजेगा pointsEarned?

समस्या यह है कि pointsEarned सेट करने के लिए, teacher OAuth स्कोप की ज़रूरत होती है. छात्र-छात्राओं को teacher स्कोप की अनुमति नहीं देनी चाहिए. ऐसा करने पर, छात्र-छात्राएं आपके ऐड-ऑन के साथ इंटरैक्ट करते समय, अनचाहे नतीजे मिल सकते हैं. जैसे, छात्र-छात्राओं को Student View iframe के बजाय, Teacher View iframe लोड हो सकता है. इसलिए, pointsEarned सेट करने के लिए आपके पास दो विकल्प हैं:

  • लॉग इन किए हुए शिक्षक के क्रेडेंशियल का इस्तेमाल करना.
  • सेव किए गए (ऑफ़लाइन) शिक्षक क्रेडेंशियल का इस्तेमाल करना.

यहां दिए गए सेक्शन में, हर तरीके के फ़ायदे और नुकसान के बारे में बताया गया है. इसके बाद, हर तरीके को लागू करने का तरीका बताया गया है. ध्यान दें कि हमारे दिए गए उदाहरणों में, Classroom को ग्रेड पास करने के दोनों तरीके दिखाए गए हैं. दिए गए उदाहरणों को चलाते समय, कोई तरीका चुनने का तरीका जानने के लिए, यहां दी गई भाषा के हिसाब से निर्देश देखें:

Python

webapp/attachment_routes.py फ़ाइल में सबसे ऊपर, SET_GRADE_WITH_LOGGED_IN_USER_CREDENTIALS का एलान देखें. साइन इन किए हुए शिक्षक के क्रेडेंशियल का इस्तेमाल करके ग्रेड वापस भेजने के लिए, इस वैल्यू को True पर सेट करें. छात्र-छात्रा के गतिविधि सबमिट करने पर, सेव किए गए क्रेडेंशियल का इस्तेमाल करके ग्रेड वापस भेजने के लिए, इस वैल्यू को False पर सेट करें.

साइन इन किए हुए शिक्षक के क्रेडेंशियल का इस्तेमाल करके ग्रेड सेट करना

pointsEarned सेट करने के लिए अनुरोध भेजने के लिए, साइन इन किए हुए उपयोगकर्ता के क्रेडेंशियल का इस्तेमाल करें. यह तरीका, अब तक लागू किए गए तरीके जैसा ही है. इसलिए, इसे समझना आसान है.

हालांकि, ध्यान रखें कि शिक्षक, Student Work Review iframe में सिर्फ़ छात्र-छात्रा के सबमिशन के साथ इंटरैक्ट करता है. इससे कुछ अहम चीज़ें तय होती हैं:

  • जब तक शिक्षक, Classroom के यूज़र इंटरफ़ेस (यूआई) में कोई कार्रवाई नहीं करता, तब तक Classroom में कोई ग्रेड नहीं दिखता.
  • सभी छात्र-छात्राओं के ग्रेड देखने के लिए, शिक्षक को हर छात्र-छात्रा का सबमिशन खोलना पड़ सकता है.
  • Classroom को ग्रेड मिलने और Classroom के यूज़र इंटरफ़ेस (यूआई) में दिखने के बीच थोड़ा समय लगता है. आम तौर पर, इसमें पांच से दस सेकंड लगते हैं. हालांकि, इसमें 30 सेकंड तक लग सकते हैं.

इन वजहों से, शिक्षकों को क्लास के सभी ग्रेड देखने के लिए, मैन्युअल तरीके से काफ़ी समय खर्च करना पड़ सकता है.

इस तरीके को लागू करने के लिए, अपने मौजूदा Student Work Review रूट में एक और एपीआई कॉल जोड़ें.

छात्र-छात्रा के सबमिशन और अटैचमेंट के रिकॉर्ड फ़ेच करने के बाद, छात्र-छात्रा के सबमिशन का आकलन करें और मिले हुए ग्रेड को सेव करें. AddOnAttachmentStudentSubmission ऑब्जेक्ट के pointsEarned फ़ील्ड में ग्रेड सेट करें. आखिर में, अनुरोध के मुख्य हिस्से में AddOnAttachmentStudentSubmission इंस्टेंस के साथ, courses.courseWork.addOnAttachments.studentSubmissions एंडपॉइंट को PATCH अनुरोध भेजें. ध्यान दें कि हमें अपने PATCH अनुरोध में, updateMask में pointsEarned भी बताना होगा:

Python

# 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)

grade = 0

# See if the student response matches the stored name.
if student_submission.student_response.lower(
) == attachment.image_caption.lower():
    grade = attachment.max_points

# Create an instance of the Classroom service.
classroom_service = ch._credential_handler.get_classroom_service()

# Build an AddOnAttachmentStudentSubmission instance.
add_on_attachment_student_submission = {
    # Specifies the student's score for this attachment.
    "pointsEarned": grade,
}

# Issue a PATCH request to set the grade numerator for this attachment.
patch_grade_response = classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().patch(
    courseId=flask.session["courseId"],
    itemId=flask.session["itemId"],
    attachmentId=flask.session["attachmentId"],
    submissionId=flask.session["submissionId"],
    # updateMask is a list of fields being modified.
    updateMask="pointsEarned",
    body=add_on_attachment_student_submission).execute()

ऑफ़लाइन शिक्षक क्रेडेंशियल का इस्तेमाल करके ग्रेड सेट करना

ग्रेड सेट करने के दूसरे तरीके के लिए, अटैचमेंट बनाने वाले शिक्षक के सेव किए गए क्रेडेंशियल का इस्तेमाल करना ज़रूरी है. इस तरीके को लागू करने के लिए, आपको पहले से अनुमति पा चुके शिक्षक के रीफ़्रेश और ऐक्सेस टोकन का इस्तेमाल करके क्रेडेंशियल बनाने होंगे. इसके बाद, इन क्रेडेंशियल का इस्तेमाल करके pointsEarned सेट करना होगा.

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

इस तरीके को लागू करने के लिए, ये टास्क पूरे करें:

  1. ऐक्सेस टोकन सेव करने के लिए, उपयोगकर्ता डेटाबेस के रिकॉर्ड में बदलाव करना.
  2. शिक्षक आईडी सेव करने के लिए, अटैचमेंट डेटाबेस के रिकॉर्ड में बदलाव करना.
  3. शिक्षक के क्रेडेंशियल वापस पाना और (ज़रूरी नहीं) Classroom सेवा का नया इंस्टेंस बनाना.
  4. सबमिशन के लिए ग्रेड सेट करना.

इस उदाहरण के लिए, छात्र-छात्रा के गतिविधि पूरी करने पर ग्रेड सेट करें. इसका मतलब है कि जब छात्र-छात्रा, Student View रूट में फ़ॉर्म सबमिट करता है.

ऐक्सेस टोकन सेव करने के लिए, उपयोगकर्ता डेटाबेस के रिकॉर्ड में बदलाव करना

एपीआई कॉल करने के लिए, दो यूनीक टोकन की ज़रूरत होती है: रीफ़्रेश टोकन और ऐक्सेस टोकन. अगर आपने अब तक, लेखों की सीरीज़ में बताए गए तरीके का इस्तेमाल किया है, तो आपके User टेबल स्कीमा में पहले से ही रीफ़्रेश टोकन सेव होना चाहिए. रीफ़्रेश टोकन सेव करना तब ज़रूरी होता है, जब एपीआई कॉल सिर्फ़ साइन इन किए हुए उपयोगकर्ता के क्रेडेंशियल से किए जाते हैं. ऐसा इसलिए, क्योंकि आपको पुष्टि करने के फ़्लो के तहत, ऐक्सेस टोकन मिलता है.

हालांकि, अब आपको साइन इन किए हुए उपयोगकर्ता के अलावा किसी और के क्रेडेंशियल से कॉल करने होंगे. इसका मतलब है कि पुष्टि करने का फ़्लो उपलब्ध नहीं है. इसलिए, आपको रीफ़्रेश टोकन के साथ-साथ ऐक्सेस टोकन भी सेव करना होगा. ऐक्सेस टोकन शामिल करने के लिए, User टेबल स्कीमा अपडेट करें:

Python

हमारे दिए गए उदाहरण में, यह webapp/models.py फ़ाइल में है.

# Database model to represent a user.
class User(db.Model):
    # The user's identifying information:
    id = db.Column(db.String(120), primary_key=True)
    display_name = db.Column(db.String(80))
    email = db.Column(db.String(120), unique=True)
    portrait_url = db.Column(db.Text())

    # The user's refresh token, which will be used to obtain an access token.
    # Note that refresh tokens will become invalid if:
    # - The refresh token has not been used for six months.
    # - The user revokes your app's access permissions.
    # - The user changes passwords.
    # - The user belongs to a Google Cloud organization
    #   that has session control policies in effect.
    refresh_token = db.Column(db.Text())

    # An access token for this user.
    access_token = db.Column(db.Text())

इसके बाद, User रिकॉर्ड बनाने या अपडेट करने वाले किसी भी कोड को अपडेट करें, ताकि ऐक्सेस टोकन भी सेव किया जा सके:

Python

हमारे दिए गए उदाहरण में, यह webapp/credential_handler.py फ़ाइल में है.

def save_credentials_to_storage(self, credentials):
    # Issue a request for the user's profile details.
    user_info_service = googleapiclient.discovery.build(
        serviceName="oauth2", version="v2", credentials=credentials)
    user_info = user_info_service.userinfo().get().execute()
    flask.session["username"] = user_info.get("name")
    flask.session["login_hint"] = user_info.get("id")

    # See if we have any stored credentials for this user. If they have used
    # the add-on before, we should have received login_hint in the query
    # parameters.
    existing_user = self.get_credentials_from_storage(user_info.get("id"))

    # If we do have stored credentials, update the database.
    if existing_user:
        if user_info:
            existing_user.id = user_info.get("id")
            existing_user.display_name = user_info.get("name")
            existing_user.email = user_info.get("email")
            existing_user.portrait_url = user_info.get("picture")

        if credentials and credentials.refresh_token is not None:
            existing_user.refresh_token = credentials.refresh_token
            # Update the access token.
            existing_user.access_token = credentials.token

    # If not, this must be a new user, so add a new entry to the database.
    else:
        new_user = User(
            id=user_info.get("id"),
            display_name=user_info.get("name"),
            email=user_info.get("email"),
            portrait_url=user_info.get("picture"),
            refresh_token=credentials.refresh_token,
            # Store the access token as well.
            access_token=credentials.token)

        db.session.add(new_user)

    db.session.commit()

शिक्षक आईडी सेव करने के लिए, अटैचमेंट डेटाबेस के रिकॉर्ड में बदलाव करना

किसी गतिविधि के लिए ग्रेड सेट करने के लिए, कोर्स में शिक्षक के तौर पर pointsEarned सेट करने के लिए कॉल करें. ऐसा करने के कई तरीके हैं:

  • शिक्षक क्रेडेंशियल से कोर्स आईडी की लोकल मैपिंग सेव करना. हालांकि, ध्यान दें कि ज़रूरी नहीं है कि एक ही शिक्षक हमेशा किसी खास कोर्स से जुड़ा हो.
  • मौजूदा शिक्षक या शिक्षकों की जानकारी पाने के लिए, Classroom API के courses एंडपॉइंट को GET अनुरोध भेजना. इसके बाद, मैच करने वाले शिक्षक क्रेडेंशियल ढूंढने के लिए, लोकल उपयोगकर्ता रिकॉर्ड क्वेरी करना.
  • ऐड-ऑन का अटैचमेंट बनाते समय, लोकल अटैचमेंट डेटाबेस में शिक्षक आईडी सेव करना. इसके बाद, Student View iframe को पास किए गए attachmentId से शिक्षक क्रेडेंशियल वापस पाना.

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

अपने डेटाबेस की Attachment टेबल में, शिक्षक आईडी फ़ील्ड जोड़ें:

Python

हमारे दिए गए उदाहरण में, यह webapp/models.py फ़ाइल में है.

# Database model to represent an attachment.
class Attachment(db.Model):
    # The attachmentId is the unique identifier for the attachment.
    attachment_id = db.Column(db.String(120), primary_key=True)

    # The image filename to store.
    image_filename = db.Column(db.String(120))

    # The image caption to store.
    image_caption = db.Column(db.String(120))

    # The maximum number of points for this activity.
    max_points = db.Column(db.Integer)

    # The ID of the teacher that created the attachment.
    teacher_id = db.Column(db.String(120))

इसके बाद, Attachment रिकॉर्ड बनाने या अपडेट करने वाले किसी भी कोड को अपडेट करें, ताकि बनाने वाले का आईडी भी सेव किया जा सके:

Python

हमारे दिए गए उदाहरण में, यह webapp/attachment_routes.py फ़ाइल में create_attachments तरीके में है.

# Store the attachment by id.
new_attachment = Attachment(
    # The new attachment's unique ID, returned in the CREATE response.
    attachment_id=resp.get("id"),
    image_filename=key,
    image_caption=value,
    max_points=int(resp.get("maxPoints")),
    teacher_id=flask.session["login_hint"])
db.session.add(new_attachment)
db.session.commit()

शिक्षक के क्रेडेंशियल वापस पाना

Student View iframe दिखाने वाला रूट ढूंढें. अपने लोकल डेटाबेस में छात्र-छात्रा का जवाब सेव करने के तुरंत बाद, अपने लोकल स्टोरेज से शिक्षक के क्रेडेंशियल वापस पाएं. पिछले दो चरणों में की गई तैयारी को देखते हुए, यह काम आसानी से किया जा सकता है. इन क्रेडेंशियल का इस्तेमाल, शिक्षक उपयोगकर्ता के लिए Classroom सेवा का नया इंस्टेंस बनाने के लिए भी किया जा सकता है:

Python

हमारे दिए गए उदाहरण में, यह webapp/attachment_routes.py फ़ाइल में load_activity_attachment तरीके में है.

# Create an instance of the Classroom service using the tokens for the
# teacher that created the attachment.

# We're assuming that there are already credentials in the session, which
# should be true given that we are adding this within the Student View
# route; we must have had valid credentials for the student to reach this
# point. The student credentials will be valid to construct a Classroom
# service for another user except for the tokens.
if not flask.session.get("credentials"):
    raise ValueError(
        "No credentials found in session for the requested user.")

# Make a copy of the student credentials so we don't modify the original.
teacher_credentials_dict = deepcopy(flask.session.get("credentials"))

# Retrieve the requested user's stored record.
teacher_record = User.query.get(attachment.teacher_id)

# Apply the user's tokens to the copied credentials.
teacher_credentials_dict["refresh_token"] = teacher_record.refresh_token
teacher_credentials_dict["token"] = teacher_record.access_token

# Construct a temporary credentials object.
teacher_credentials = google.oauth2.credentials.Credentials(
    **teacher_credentials_dict)

# Refresh the credentials if necessary; we don't know when this teacher last
# made a call.
if teacher_credentials.expired:
    teacher_credentials.refresh(Request())

# Request the Classroom service for the specified user.
teacher_classroom_service = googleapiclient.discovery.build(
    serviceName=CLASSROOM_API_SERVICE_NAME,
    version=CLASSROOM_API_VERSION,
    credentials=teacher_credentials)

सबमिशन के लिए ग्रेड सेट करना

यहां से आगे का तरीका, साइन इन किए हुए शिक्षक के क्रेडेंशियल का इस्तेमाल करने वाले तरीके जैसा ही है. हालांकि, ध्यान दें कि आपको पिछले चरण में वापस पाए गए शिक्षक क्रेडेंशियल से कॉल करना चाहिए:

Python

# Issue a PATCH request as the teacher to set the grade numerator for this
# attachment.
patch_grade_response = teacher_classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().patch(
    courseId=flask.session["courseId"],
    itemId=flask.session["itemId"],
    attachmentId=flask.session["attachmentId"],
    submissionId=flask.session["submissionId"],
    # updateMask is a list of fields being modified.
    updateMask="pointsEarned",
    body=add_on_attachment_student_submission).execute()

ऐड-ऑन की जांच करना

पिछले लेख की तरह, शिक्षक के तौर पर गतिविधि वाले अटैचमेंट के साथ एक असाइनमेंट बनाएं. इसके बाद, छात्र-छात्रा के तौर पर जवाब सबमिट करें. फिर, Student Work Review iframe में अपना सबमिशन खोलें. लागू करने के तरीके के हिसाब से, आपको अलग-अलग समय पर ग्रेड दिखना चाहिए:

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

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

बधाई हो! अब अगले चरण पर जाएं. इसमें, अटैचमेंट बनाने का तरीका Google Classroom के बाहर बताया गया है.