সংযুক্তি গ্রেড এবং গ্রেড পাসব্যাক

ক্লাসরুম অ্যাড-অন ওয়াকথ্রু সিরিজের এটি ষষ্ঠ ওয়াকথ্রু।

এই ওয়াকথ্রুতে, আপনি একটি গ্রেডেড অ্যাক্টিভিটি-টাইপ অ্যাটাচমেন্ট তৈরি করতে আগের ওয়াকথ্রু ধাপ থেকে উদাহরণটি পরিবর্তন করেন। এছাড়াও আপনি প্রোগ্রাম্যাটিকভাবে Google ক্লাসরুমে একটি গ্রেড ফেরত পাস করেন , যা শিক্ষকের গ্রেড বইতে খসড়া গ্রেড হিসাবে প্রদর্শিত হয়।

এই ওয়াকথ্রু সিরিজের অন্যদের থেকে কিছুটা আলাদা যে ক্লাসরুমে গ্রেড পাস করার দুটি সম্ভাব্য পন্থা রয়েছে। উভয়েরই বিকাশকারী এবং ব্যবহারকারীর অভিজ্ঞতার উপর স্বতন্ত্র প্রভাব রয়েছে; আপনার ক্লাসরুম অ্যাড-অন ডিজাইন করার সময় উভয়কেই বিবেচনা করুন। বাস্তবায়নের বিকল্পগুলির অতিরিক্ত আলোচনার জন্য আমাদের সংযুক্তিগুলির সাথে ইন্টারঅ্যাকটিং গাইড পৃষ্ঠাটি পড়ুন।

উল্লেখ্য যে API-এর গ্রেডিং বৈশিষ্ট্যগুলি ঐচ্ছিক ৷ এগুলি যে কোনও অ্যাক্টিভিটি-টাইপ সংযুক্তির সাথে ব্যবহার করা যেতে পারে।

এই ওয়াকথ্রু চলাকালীন, আপনি নিম্নলিখিতগুলি সম্পূর্ণ করবেন:

  • সংযুক্তির গ্রেড ডিনোমিনেটরও সেট করতে Classroom API-তে পূর্ববর্তী সংযুক্তি তৈরির অনুরোধগুলি সংশোধন করুন।
  • প্রোগ্রাম্যাটিকভাবে শিক্ষার্থীর জমা দেওয়া স্কোর করুন এবং সংযুক্তির গ্রেড সংখ্যা সেট করুন।
  • সাইন-ইন বা অফলাইন শিক্ষক শংসাপত্র ব্যবহার করে ক্লাসরুমে জমা দেওয়ার গ্রেড পাস করার জন্য দুটি পদ্ধতি প্রয়োগ করুন।

একবার শেষ হয়ে গেলে, পাসব্যাক আচরণ ট্রিগার হওয়ার পরে ক্লাসরুমের গ্রেডবুকে গ্রেডগুলি উপস্থিত হয়। সঠিক মুহূর্ত কখন এটি ঘটে তা বাস্তবায়ন পদ্ধতির উপর নির্ভর করে।

এই উদাহরণের উদ্দেশ্যে, পূর্ববর্তী ওয়াকথ্রু থেকে ক্রিয়াকলাপটি পুনরায় ব্যবহার করুন, যেখানে একজন শিক্ষার্থীকে একটি বিখ্যাত ল্যান্ডমার্কের একটি চিত্র দেখানো হয় এবং তার নাম লিখতে অনুরোধ করা হয়। শিক্ষার্থী সঠিক নাম লিখলে সংযুক্তির জন্য পূর্ণ নম্বর বরাদ্দ করুন, অন্যথায় শূন্য।

ক্লাসরুম অ্যাড-অন API গ্রেডিং বৈশিষ্ট্য বুঝুন

আপনার অ্যাড-অন একটি সংযুক্তির জন্য গ্রেড সংখ্যা এবং গ্রেড ডিনোমিনেটর উভয়ই সেট করতে পারে। এগুলি যথাক্রমে API-এ pointsEarned এবং maxPoints মান ব্যবহার করে সেট করা হয়েছে। ক্লাসরুম UI-তে একটি সংযুক্তি কার্ড maxPoints মান দেখায় যখন এটি সেট করা হয়।

একটি অ্যাসাইনমেন্টে maxPoints সহ একাধিক সংযুক্তির উদাহরণ

চিত্র 1. maxPoints সেট করা তিনটি অ্যাড-অন সংযুক্তি কার্ড সহ অ্যাসাইনমেন্ট তৈরির UI।

ক্লাসরুম অ্যাড-অন API আপনাকে সেটিংস কনফিগার করতে এবং সংযুক্তি গ্রেডের জন্য অর্জিত স্কোর সেট করতে দেয়। এগুলি অ্যাসাইনমেন্ট গ্রেডগুলির মতো নয়৷ যাইহোক, অ্যাসাইনমেন্ট গ্রেড সেটিংস সংযুক্তিটির সংযুক্তি গ্রেড সেটিংস অনুসরণ করে যার সংযুক্তি কার্ডে গ্রেড সিঙ্ক লেবেল রয়েছে৷ যখন "গ্রেড সিঙ্ক" সংযুক্তি একটি ছাত্র জমা দেওয়ার জন্য pointsEarned সেট করে, তখন এটি অ্যাসাইনমেন্টের জন্য ছাত্রের খসড়া গ্রেডও সেট করে৷

সাধারণত, maxPoints সেট করে এমন অ্যাসাইনমেন্টে যোগ করা প্রথম সংযুক্তি "গ্রেড সিঙ্ক" লেবেল পায়। "গ্রেড সিঙ্ক" লেবেলের উদাহরণের জন্য চিত্র 1-এ দেখানো অ্যাসাইনমেন্ট তৈরির UI উদাহরণ দেখুন। মনে রাখবেন যে "সংযুক্তি 1" কার্ডে "গ্রেড সিঙ্ক" লেবেল রয়েছে এবং লাল বাক্সে অ্যাসাইনমেন্ট গ্রেডটি 50 পয়েন্টে আপডেট করা হয়েছে৷ এছাড়াও মনে রাখবেন যে চিত্র 1 যদিও তিনটি সংযুক্তি কার্ড দেখায়, শুধুমাত্র একটি কার্ডে "গ্রেড সিঙ্ক" লেবেল রয়েছে৷ এটি বর্তমান বাস্তবায়নের একটি মূল সীমাবদ্ধতা: শুধুমাত্র একটি সংযুক্তিতে "গ্রেড সিঙ্ক" লেবেল থাকতে পারে

maxPoints সেট করা একাধিক অ্যাটাচমেন্ট থাকলে, "গ্রেড সিঙ্ক" দিয়ে অ্যাটাচমেন্ট মুছে দিলে বাকি অ্যাটাচমেন্টগুলির কোনওটিতেই "গ্রেড সিঙ্ক" সক্ষম হয় নাmaxPoints সেট করে এমন আরেকটি সংযুক্তি যোগ করা নতুন সংযুক্তিতে গ্রেড সিঙ্ক সক্ষম করে, এবং সর্বাধিক অ্যাসাইনমেন্ট গ্রেড মিলের সাথে সামঞ্জস্য করে। কোন অ্যাটাচমেন্টে "গ্রেড সিঙ্ক" লেবেল আছে তা প্রোগ্রাম্যাটিকভাবে দেখার বা একটি নির্দিষ্ট অ্যাসাইনমেন্টে কতটি অ্যাটাচমেন্ট আছে তা দেখার কোনো ব্যবস্থা নেই।

একটি সংযুক্তির সর্বোচ্চ গ্রেড সেট করুন

এই বিভাগে একটি সংযুক্তি গ্রেডের জন্য হর সেট করা বর্ণনা করে; অর্থাৎ, সব শিক্ষার্থী তাদের জমা দেওয়ার জন্য সর্বোচ্চ সম্ভাব্য স্কোর অর্জন করতে পারে। এটি করতে, সংযুক্তির maxPoints মান সেট করুন।

গ্রেডিং বৈশিষ্ট্যগুলি সক্ষম করার জন্য আমাদের বিদ্যমান বাস্তবায়নে শুধুমাত্র একটি ছোটখাট পরিবর্তন করা প্রয়োজন। একটি সংযুক্তি তৈরি করার সময়, একই AddOnAttachment অবজেক্টে maxPoints মান যোগ করুন যাতে studentWorkReviewUri , teacherViewUri , এবং অন্যান্য সংযুক্তি ক্ষেত্র রয়েছে।

নোট করুন যে একটি নতুন অ্যাসাইনমেন্টের জন্য ডিফল্ট সর্বোচ্চ স্কোর হল 100৷ আমরা 100 ব্যতীত অন্য কোনও মান maxPoints সেট করার পরামর্শ দিই যাতে আপনি যাচাই করতে পারেন যে গ্রেডগুলি সঠিকভাবে সেট করা হচ্ছে৷ একটি প্রদর্শন হিসাবে maxPoints 50 এ সেট করুন:

পাইথন

courses.courseWork.addOnAttachments এন্ডপয়েন্টে একটি CREATE রিকোয়েস্ট ইস্যু করার আগে attachment অবজেক্ট তৈরি করার সময় maxPoints ফিল্ড যোগ করুন। আমাদের দেওয়া উদাহরণ অনুসরণ করলে আপনি 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 মান সংরক্ষণ করেন; এটি ছাত্র জমা দেওয়ার গ্রেডিং করার সময় পরে একটি অতিরিক্ত API কল করতে থাকা সংরক্ষণ করে। মনে রাখবেন, তবে, এটা সম্ভব যে শিক্ষকরা আপনার অ্যাড-অন থেকে স্বাধীনভাবে অ্যাসাইনমেন্ট গ্রেড সেটিংস পরিবর্তন করে। অ্যাসাইনমেন্ট-লেভেল maxPoints মান দেখতে courses.courseWork এন্ডপয়েন্টে একটি GET অনুরোধ পাঠান। এটি করার সময়, CourseWork.id ক্ষেত্রে itemId পাস করুন।

সংযুক্তির maxPoints মান ধরে রাখতে এখন আপনার ডাটাবেস মডেল আপডেট করুন। আমরা CREATE প্রতিক্রিয়া থেকে maxPoints মান ব্যবহার করার পরামর্শ দিই:

পাইথন

প্রথমে, 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()

সংযুক্তি এখন সর্বোচ্চ গ্রেড আছে. আপনি এখন এই আচরণ পরীক্ষা করতে সক্ষম হওয়া উচিত; একটি নতুন অ্যাসাইনমেন্টে একটি সংযুক্তি যোগ করুন এবং লক্ষ্য করুন যে সংযুক্তি কার্ডটি "গ্রেড সিঙ্ক" লেবেল এবং অ্যাসাইনমেন্টের "পয়েন্টস" মান পরিবর্তন দেখায়।

ক্লাসরুমে ছাত্র জমা দেওয়ার গ্রেড সেট করুন

এই বিভাগটি একটি সংযুক্তি গ্রেডের জন্য অংক সেট করার বর্ণনা দেয়; এটি, সংযুক্তির জন্য একজন পৃথক ছাত্রের স্কোর। এটি করার জন্য, একটি ছাত্র জমা দেওয়ার pointsEarned মান সেট করুন।

আপনার কাছে এখন একটি গুরুত্বপূর্ণ সিদ্ধান্ত নেওয়ার আছে: কিভাবে আপনার অ্যাড-অনকে pointsEarned সেট করার অনুরোধ ইস্যু করা উচিত ?

সমস্যা হল যে pointsEarned সেট করার জন্য teacher OAuth সুযোগ প্রয়োজন । আপনি ছাত্র ব্যবহারকারীদের teacher সুযোগ প্রদান করা উচিত নয়; ছাত্ররা আপনার অ্যাড-অনের সাথে ইন্টারঅ্যাক্ট করলে এটি অপ্রত্যাশিত আচরণের কারণ হতে পারে যেমন ছাত্র ভিউ আইফ্রেমের পরিবর্তে শিক্ষক ভিউ আইফ্রেম লোড করা। সুতরাং কিভাবে pointsEarned সেট করতে হবে তার জন্য আপনার কাছে দুটি পছন্দ আছে:

  • লগ ইন করা শিক্ষকের শংসাপত্র ব্যবহার করে।
  • সঞ্চিত (অফলাইন) শিক্ষক শংসাপত্র ব্যবহার করে।

নিম্নলিখিত বিভাগগুলি প্রতিটি বাস্তবায়ন প্রদর্শনের আগে প্রতিটি পদ্ধতির ট্রেডঅফ নিয়ে আলোচনা করে। মনে রাখবেন যে আমাদের প্রদত্ত উদাহরণগুলি ক্লাসরুমে একটি গ্রেড পাস করার উভয় পন্থা প্রদর্শন করে; প্রদত্ত উদাহরণগুলি চালানোর সময় কীভাবে একটি পদ্ধতি নির্বাচন করতে হয় তা দেখতে নীচের ভাষা-নির্দিষ্ট নির্দেশাবলী দেখুন:

পাইথন

webapp/attachment_routes.py ফাইলের শীর্ষে SET_GRADE_WITH_LOGGED_IN_USER_CREDENTIALS ঘোষণাটি খুঁজুন৷ সাইন-ইন করা শিক্ষকের শংসাপত্র ব্যবহার করে ব্যাক গ্রেড পাস করতে এই মানটি True সেট করুন। ছাত্র যখন কার্যকলাপ জমা দেয় তখন সঞ্চিত শংসাপত্রগুলি ব্যবহার করে ব্যাক গ্রেড পাস করতে এই মানটি False এ সেট করুন৷

সাইন ইন করা শিক্ষকের শংসাপত্র ব্যবহার করে গ্রেড সেট করুন

pointsEarned সেট করার অনুরোধ জারি করতে সাইন-ইন করা ব্যবহারকারীর শংসাপত্র ব্যবহার করুন। এটি বেশ স্বজ্ঞাত বলে মনে করা উচিত কারণ এটি এখনও অবধি বাস্তবায়নের বাকি অংশগুলিকে প্রতিফলিত করে এবং উপলব্ধি করার জন্য সামান্য প্রচেষ্টার প্রয়োজন৷

যাইহোক, বিবেচনা করুন যে শিক্ষক শুধুমাত্র স্টুডেন্ট ওয়ার্ক রিভিউ আইফ্রেমে শিক্ষার্থীর জমা দেওয়ার সাথে ইন্টারঅ্যাক্ট করেন। এর কিছু গুরুত্বপূর্ণ প্রভাব রয়েছে:

  • শিক্ষক ক্লাসরুম UI-তে পদক্ষেপ না নেওয়া পর্যন্ত ক্লাসরুমে কোনও গ্রেড তৈরি হবে না।
  • সমস্ত শিক্ষার্থীর গ্রেড পূরণ করার জন্য একজন শিক্ষককে প্রতিটি ছাত্র জমা খুলতে হতে পারে।
  • ক্লাসরুমে গ্রেড প্রাপ্তি এবং ক্লাসরুম UI-তে এর উপস্থিতির মধ্যে একটি সংক্ষিপ্ত বিলম্ব রয়েছে। বিলম্ব সাধারণত পাঁচ থেকে দশ সেকেন্ড, কিন্তু 30 সেকেন্ড পর্যন্ত হতে পারে।

এই কারণগুলির সংমিশ্রণের অর্থ হল যে শিক্ষকদের একটি ক্লাসের গ্রেড সম্পূর্ণরূপে পূরণ করার জন্য যথেষ্ট, সময়সাপেক্ষ ম্যানুয়াল কাজ করতে হতে পারে।

এই পদ্ধতি বাস্তবায়ন করতে, আপনার বিদ্যমান স্টুডেন্ট ওয়ার্ক রিভিউ রুটে একটি অতিরিক্ত API কল যোগ করুন।

ছাত্র জমা দেওয়া এবং সংযুক্তি রেকর্ডগুলি আনার পরে, ছাত্রের জমা দেওয়ার মূল্যায়ন করুন এবং ফলস্বরূপ গ্রেড সংরক্ষণ করুন৷ একটি AddOnAttachmentStudentSubmission অবজেক্টের pointsEarned ফিল্ডে গ্রেড সেট করুন। অবশেষে, অনুরোধের বডিতে AddOnAttachmentStudentSubmission উদাহরণ সহ courses.courseWork.addOnAttachments.studentSubmissions এন্ডপয়েন্টে একটি PATCH অনুরোধ জারি করুন। মনে রাখবেন যে আমাদের PATCH অনুরোধে updateMask pointsEarned নির্দিষ্ট করতে হবে:

পাইথন

# 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 সেট করতে এই শংসাপত্রগুলি ব্যবহার করুন।

এই পদ্ধতির একটি গুরুত্বপূর্ণ সুবিধা হল যে উপরে উল্লিখিত সমস্যাগুলি এড়িয়ে, ক্লাসরুম UI-তে শিক্ষকের পদক্ষেপের প্রয়োজন ছাড়াই গ্রেডগুলি তৈরি হয় ৷ ফলাফল হল যে শেষ ব্যবহারকারীরা গ্রেডিং অভিজ্ঞতাকে নির্বিঘ্ন এবং দক্ষ হিসাবে উপলব্ধি করে। অতিরিক্তভাবে, এই পদ্ধতিটি আপনাকে সেই মুহূর্তটি বেছে নিতে দেয় যেখানে আপনি ব্যাক গ্রেড পাস করেন, যেমন ছাত্ররা যখন কার্যকলাপ বা অ্যাসিঙ্ক্রোনাসভাবে সম্পূর্ণ করে।

এই পদ্ধতি বাস্তবায়নের জন্য নিম্নলিখিত কাজগুলি সম্পূর্ণ করুন:

  1. একটি অ্যাক্সেস টোকেন সংরক্ষণ করার জন্য ব্যবহারকারীর ডাটাবেস রেকর্ড পরিবর্তন করুন।
  2. একটি শিক্ষক আইডি সংরক্ষণ করতে সংযুক্তি ডাটাবেস রেকর্ড পরিবর্তন করুন।
  3. শিক্ষকের শংসাপত্রগুলি পুনরুদ্ধার করুন এবং (ঐচ্ছিকভাবে) একটি নতুন ক্লাসরুম পরিষেবা দৃষ্টান্ত তৈরি করুন৷
  4. একটি জমা এর গ্রেড সেট করুন.

এই প্রদর্শনের উদ্দেশ্যে, শিক্ষার্থী যখন কার্যকলাপটি সম্পূর্ণ করবে তখন গ্রেড সেট করুন; এটি হল, যখন ছাত্র ছাত্র ভিউ রুটে ফর্ম জমা দেয়।

অ্যাক্সেস টোকেন সঞ্চয় করতে ব্যবহারকারীর ডাটাবেস রেকর্ড পরিবর্তন করুন

API কল করার জন্য দুটি অনন্য টোকেন প্রয়োজন, রিফ্রেশ টোকেন এবং অ্যাক্সেস টোকেন । আপনি যদি এই পর্যন্ত ওয়াকথ্রু সিরিজ অনুসরণ করে থাকেন, আপনার User টেবিল স্কিমা ইতিমধ্যেই একটি রিফ্রেশ টোকেন সংরক্ষণ করা উচিত। রিফ্রেশ টোকেন সংরক্ষণ করা যথেষ্ট যখন আপনি শুধুমাত্র সাইন-ইন করা ব্যবহারকারীর সাথে API কল করেন, কারণ আপনি প্রমাণীকরণ প্রবাহের অংশ হিসাবে একটি অ্যাক্সেস টোকেন পান৷

যাইহোক, আপনাকে এখন সাইন-ইন করা ব্যবহারকারী ব্যতীত অন্য কেউ হিসাবে কল করতে হবে, যার অর্থ প্রমাণীকরণ প্রবাহ উপলব্ধ নয়। সুতরাং, আপনাকে রিফ্রেশ টোকেনের পাশাপাশি অ্যাক্সেস টোকেন সংরক্ষণ করতে হবে। একটি অ্যাক্সেস টোকেন অন্তর্ভুক্ত করতে আপনার User টেবিল স্কিমা আপডেট করুন:

পাইথন

আমাদের প্রদত্ত উদাহরণে, এটি 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 রেকর্ড তৈরি বা আপডেট করে এমন কোনও কোড আপডেট করুন:

পাইথন

আমাদের প্রদত্ত উদাহরণে, এটি 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 অনুরোধ ইস্যু করুন। তারপরে, মিলে যাওয়া শিক্ষকের শংসাপত্রগুলি সনাক্ত করতে স্থানীয় ব্যবহারকারীর রেকর্ডগুলি অনুসন্ধান করুন৷
  • একটি অ্যাড-অন সংযুক্তি তৈরি করার সময়, স্থানীয় সংযুক্তি ডাটাবেসে একটি শিক্ষক আইডি সংরক্ষণ করুন। তারপর, স্টুডেন্ট ভিউ আইফ্রেমে পাস করা attachmentId থেকে শিক্ষকের শংসাপত্রগুলি পুনরুদ্ধার করুন।

এই উদাহরণটি শেষ বিকল্পটি দেখায় যেহেতু আপনি গ্রেড সেট করছেন যখন ছাত্র একটি কার্যকলাপ সংযুক্তি সম্পূর্ণ করে।

আপনার ডাটাবেসের Attachment টেবিলে একটি শিক্ষক আইডি ক্ষেত্র যোগ করুন:

পাইথন

আমাদের প্রদত্ত উদাহরণে, এটি 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 রেকর্ড তৈরি বা আপডেট করে এমন যেকোনো কোড আপডেট করুন:

পাইথন

আমাদের প্রদত্ত উদাহরণে, এটি 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()

শিক্ষকের পরিচয়পত্র পুনরুদ্ধার করুন

স্টুডেন্ট ভিউ আইফ্রেম পরিবেশন করে এমন রুট খুঁজুন। আপনার স্থানীয় ডাটাবেসে ছাত্রের প্রতিক্রিয়া সঞ্চয় করার পরপরই, আপনার স্থানীয় স্টোরেজ থেকে শিক্ষকের শংসাপত্রগুলি পুনরুদ্ধার করুন। পূর্ববর্তী দুটি ধাপে প্রস্তুতির জন্য এটি সহজবোধ্য হওয়া উচিত। শিক্ষক ব্যবহারকারীর জন্য ক্লাসরুম পরিষেবার একটি নতুন উদাহরণ তৈরি করতে আপনি এগুলি ব্যবহার করতে পারেন:

পাইথন

আমাদের প্রদত্ত উদাহরণে, এটি 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)

একটি জমা এর গ্রেড সেট করুন

এখান থেকে পদ্ধতিটি সাইন-ইন করা শিক্ষকের শংসাপত্র ব্যবহার করার মতো। যাইহোক, মনে রাখবেন যে আপনার আগের ধাপে পুনরুদ্ধার করা শিক্ষকের শংসাপত্রের সাথে কল করা উচিত:

পাইথন

# 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 খোলার আগে UI-তে তাদের খসড়া গ্রেড দেখতে পাবেন। অ্যাসাইনমেন্ট খোলার সময় আপনি এটি ছাত্র তালিকায় এবং স্টুডেন্ট ওয়ার্ক রিভিউ iframe-এর পাশের "গ্রেড" বাক্সে দেখতে পারেন।
  • শিক্ষক স্টুডেন্ট ওয়ার্ক রিভিউ iframe খুললে আপনি যদি একটি গ্রেড ফেরত দেওয়ার সিদ্ধান্ত নেন, তাহলে iframe লোড হওয়ার পরেই গ্রেডটি "গ্রেড" বাক্সে উপস্থিত হওয়া উচিত। উপরে উল্লিখিত হিসাবে, এটি 30 সেকেন্ড পর্যন্ত সময় নিতে পারে। তারপরে, নির্দিষ্ট শিক্ষার্থীর জন্য গ্রেডটি ক্লাসরুমের অন্যান্য গ্রেডবুক ভিউতেও উপস্থিত হওয়া উচিত।

নিশ্চিত করুন যে শিক্ষার্থীর জন্য সঠিক স্কোর উপস্থিত হয়েছে।

অভিনন্দন! আপনি পরবর্তী ধাপে এগিয়ে যাওয়ার জন্য প্রস্তুত: Google ক্লাসরুমের বাইরে সংযুক্তি তৈরি করা