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
अनुरोध भेजें. ऐसा करते समय, itemId
को CourseWork.id
फ़ील्ड में पास करें.
अब अपने डेटाबेस मॉडल को अपडेट करें, ताकि अटैचमेंट की 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
स्कोप नहीं देना चाहिए. ऐसा करने पर, छात्र-छात्राएं आपके ऐड-ऑन के साथ इंटरैक्ट करते समय, अनचाहे व्यवहार कर सकते हैं. जैसे, छात्र-छात्राओं के व्यू वाले iframe के बजाय, शिक्षक के व्यू वाले iframe को लोड करना. इसलिए, pointsEarned
को सेट करने के लिए आपके पास दो विकल्प हैं:
- लॉग इन किए हुए शिक्षक के क्रेडेंशियल का इस्तेमाल करके.
- शिक्षक के सेव किए गए (ऑफ़लाइन) क्रेडेंशियल का इस्तेमाल करना.
यहां दिए गए सेक्शन में, हर तरीके को लागू करने के बारे में बताने से पहले, हर तरीके के फ़ायदे और नुकसान के बारे में बताया गया है. ध्यान दें कि यहां दिए गए उदाहरणों में, Classroom में ग्रेड भेजने के दोनों तरीके दिखाए गए हैं. दिए गए उदाहरणों को इस्तेमाल करते समय, किसी एक तरीके को चुनने का तरीका जानने के लिए, यहां दी गई भाषा के हिसाब से निर्देश देखें:
Python
webapp/attachment_routes.py
फ़ाइल में सबसे ऊपर, SET_GRADE_WITH_LOGGED_IN_USER_CREDENTIALS
एलान ढूंढें. साइन इन किए हुए शिक्षक के क्रेडेंशियल का इस्तेमाल करके, ग्रेड वापस भेजने के लिए, इस वैल्यू को True
पर सेट करें. जब छात्र गतिविधि सबमिट करता है, तो स्टोर किए गए क्रेडेंशियल का इस्तेमाल करके ग्रेड भेजने के लिए, इस वैल्यू को False
पर सेट करें.
साइन इन किए हुए शिक्षक के क्रेडेंशियल का इस्तेमाल करके ग्रेड सेट करना
pointsEarned
सेट करने का अनुरोध करने के लिए, साइन इन किए हुए उपयोगकर्ता के क्रेडेंशियल का इस्तेमाल करें.
यह सुविधा काफ़ी आसान लगनी चाहिए, क्योंकि यह अब तक लागू की गई अन्य सुविधाओं जैसी ही है. साथ ही, इसे लागू करने के लिए ज़्यादा मेहनत की ज़रूरत नहीं है.
हालांकि, ध्यान रखें कि शिक्षक, छात्र-छात्रा के काम की समीक्षा करने वाले iframe में, सिर्फ़ छात्र-छात्रा के सबमिट किए गए काम से इंटरैक्ट करता है. इसकी कुछ अहम वजहें हैं:
- जब तक शिक्षक, Classroom के यूज़र इंटरफ़ेस (यूआई) में कोई कार्रवाई नहीं करता, तब तक Classroom में कोई ग्रेड नहीं दिखता.
- छात्र-छात्राओं के सभी ग्रेड अपने-आप भरने के लिए, शिक्षक को हर छात्र-छात्रा का सबमिट किया गया काम खोलना पड़ सकता है.
- Classroom को ग्रेड मिलने और उसके Classroom के यूज़र इंटरफ़ेस (यूआई) में दिखने में थोड़ी देर लगती है. आम तौर पर, यह देरी पांच से 10 सेकंड की होती है. हालांकि, यह 30 सेकंड तक भी हो सकती है.
इन बातों से पता चलता है कि किसी कक्षा के ग्रेड को पूरी तरह से भरने के लिए, शिक्षकों को काफ़ी समय और मेहनत से मैन्युअल तरीके से काम करना पड़ सकता है.
इस तरीके को लागू करने के लिए, अपने मौजूदा छात्र/छात्रा के काम की समीक्षा करने के लिए बने रूट में एक और एपीआई कॉल जोड़ें.
छात्र/छात्रा के सबमिशन और अटैचमेंट के रिकॉर्ड फ़ेच करने के बाद, छात्र/छात्रा के सबमिशन का आकलन करें और उससे मिला ग्रेड सेव करें. 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 के यूज़र इंटरफ़ेस (यूआई) में ग्रेड अपने-आप दिखने लगते हैं. इसके लिए, शिक्षक को कुछ करने की ज़रूरत नहीं होती. इससे, ऊपर बताई गई समस्याओं से बचा जा सकता है. इस वजह से, असली उपयोगकर्ताओं को ग्रेड देने का अनुभव आसान और बेहतरीन लगता है. इसके अलावा, इस तरीके से यह भी चुना जा सकता है कि ग्रेड कब भेजे जाएं. जैसे, छात्र-छात्राएं गतिविधि पूरी करने के बाद या अलग-अलग समय पर.
इस तरीके को लागू करने के लिए, ये काम करें:
- ऐक्सेस टोकन सेव करने के लिए, उपयोगकर्ता के डेटाबेस रिकॉर्ड में बदलाव करें.
- शिक्षक का आईडी सेव करने के लिए, अटैचमेंट डेटाबेस के रिकॉर्ड में बदलाव करें.
- शिक्षक के क्रेडेंशियल वापस पाएं और (ज़रूरी नहीं) नया Classroom सेवा इंस्टेंस बनाएं.
- सबमिशन का ग्रेड सेट करें.
इस डेमो के लिए, छात्र/छात्रा के गतिविधि पूरी करने पर ग्रेड सेट करें. इसका मतलब है कि जब छात्र/छात्रा, छात्र/छात्राओं के सेक्शन में जाकर फ़ॉर्म सबमिट करेगा, तब ग्रेड सेट हो जाएगा.
ऐक्सेस टोकन सेव करने के लिए, उपयोगकर्ता के डेटाबेस रिकॉर्ड में बदलाव करना
एपीआई कॉल करने के लिए, दो यूनीक टोकन ज़रूरी हैं. ये रीफ़्रेश टोकन और
ऐक्सेस टोकन हैं. अगर आपने अब तक, इस सीरीज़ में दिए गए निर्देशों का पालन किया है, तो आपके 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
अनुरोध भेजें. इसके बाद, शिक्षक के मिलते-जुलते क्रेडेंशियल ढूंढने के लिए, लोकल उपयोगकर्ता रिकॉर्ड से क्वेरी करें. - ऐड-ऑन अटैचमेंट बनाते समय, अटैचमेंट के लोकल डेटाबेस में शिक्षक आईडी सेव करें. इसके बाद, छात्र/छात्रा के व्यू वाले 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()
शिक्षक के क्रेडेंशियल वापस पाना
वह रूट ढूंढें जो स्टूडेंट व्यू का 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()
ऐड-ऑन की जांच करना
पिछले वॉकथ्रू की तरह ही, शिक्षक के तौर पर गतिविधि के टाइप का अटैचमेंट वाला असाइनमेंट बनाएं. इसके बाद, छात्र/छात्रा के तौर पर जवाब सबमिट करें. इसके बाद, छात्र/छात्रा के सबमिट किए गए जवाब को 'छात्र/छात्रा के काम की समीक्षा' iframe में खोलें. लागू करने के तरीके के आधार पर, आपको ग्रेड अलग-अलग समय पर दिख सकता है:
- अगर आपने छात्र-छात्राओं के टास्क पूरा होने पर, उन्हें ग्रेड देने का विकल्प चुना है, तो छात्र-छात्राओं के काम की समीक्षा करने वाले iframe को खोलने से पहले, आपको यूज़र इंटरफ़ेस (यूआई) में उनके ड्राफ़्ट ग्रेड दिखने चाहिए. असाइनमेंट खोलने पर, इसे छात्र/छात्रा की सूची में भी देखा जा सकता है. साथ ही, छात्र/छात्रा के काम की समीक्षा करने वाले iframe के बगल में मौजूद "ग्रेड" बॉक्स में भी देखा जा सकता है.
- अगर आपने छात्र/छात्रा के काम की समीक्षा करने वाला iframe खोलने पर, ग्रेड वापस करने का विकल्प चुना है, तो iframe लोड होने के तुरंत बाद, "ग्रेड" बॉक्स में ग्रेड दिखेगा. ऊपर बताए गए तरीके से, इसमें 30 सेकंड तक लग सकते हैं. इसके बाद, किसी छात्र या छात्रा के लिए दिया गया ग्रेड, Classroom की ग्रेडबुक के अन्य व्यू में भी दिखेगा.
पुष्टि करें कि छात्र के लिए सही स्कोर दिख रहा हो.
बधाई हो! अब आप अगले चरण पर जा सकते हैं: Google Classroom के बाहर अटैचमेंट बनाना.