রুব্রিক দিয়ে শুরু করুন

rubric হলো একটি টেমপ্লেট যা শিক্ষকরা শিক্ষার্থীদের জমা দেওয়া কাজ মূল্যায়ন করার সময় ব্যবহার করতে পারেন। ক্লাসরুম এপিআই আপনাকে শিক্ষকের পক্ষ থেকে এই রুব্রিকগুলো পরিচালনা করার পাশাপাশি শিক্ষার্থীদের জমা দেওয়া কাজের রুব্রিক গ্রেডগুলো পড়ার সুযোগ দেয়।

ক্লাসরুম UI-তে রুব্রিকের দৃশ্য চিত্র ১. শ্রেণিকক্ষের অ্যাসাইনমেন্টের একটি নমুনা মূল্যায়ন নির্দেশিকা।

এই নির্দেশিকাটি রুব্রিকস এপিআই (Rubrics API)-এর মৌলিক ধারণা এবং কার্যকারিতা ব্যাখ্যা করে। একটি রুব্রিকের সাধারণ কাঠামো এবং ক্লাসরুম ইউআই (Classroom UI)-তে কীভাবে রুব্রিক গ্রেডিং করা হয়, সে সম্পর্কে জানতে এই হেল্প সেন্টার (Help Center) আর্টিকেলগুলো দেখুন।

পূর্বশর্ত

এই নির্দেশিকাটি ধরে নেয় যে আপনার নিম্নলিখিত বিষয়গুলো রয়েছে:

একটি ডেস্কটপ অ্যাপ্লিকেশনের জন্য ক্রেডেনশিয়াল অনুমোদন করুন

আপনার অ্যাপে একজন এন্ড ইউজার হিসেবে প্রমাণীকরণ করতে এবং ব্যবহারকারীর ডেটা অ্যাক্সেস করতে, আপনাকে এক বা একাধিক OAuth 2.0 ক্লায়েন্ট আইডি তৈরি করতে হবে। গুগলের OAuth সার্ভারের কাছে একটি একক অ্যাপকে শনাক্ত করতে ক্লায়েন্ট আইডি ব্যবহৃত হয়। যদি আপনার অ্যাপ একাধিক প্ল্যাটফর্মে চলে, তবে আপনাকে প্রতিটি প্ল্যাটফর্মের জন্য একটি পৃথক ক্লায়েন্ট আইডি তৈরি করতে হবে।

  1. গুগল ক্লাউড কনসোলে গুগল ক্লাউড ক্রেডেনশিয়ালস পৃষ্ঠায় যান।
  2. ক্রেডেনশিয়াল তৈরি করুন > OAuth ক্লায়েন্ট আইডি-তে ক্লিক করুন।
  3. অ্যাপ্লিকেশন টাইপ > ডেস্কটপ অ্যাপ-এ ক্লিক করুন।
  4. 'Name ' ফিল্ডে ক্রেডেনশিয়ালটির জন্য একটি নাম টাইপ করুন। এই নামটি শুধুমাত্র গুগল ক্লাউড কনসোলে দেখানো হয়। উদাহরণস্বরূপ, 'Rubrics client'।
  5. Create-এ ক্লিক করুন। OAuth ক্লায়েন্ট তৈরি হওয়ার স্ক্রিনটি প্রদর্শিত হবে, যেখানে আপনার নতুন ক্লায়েন্ট আইডি এবং ক্লায়েন্ট সিক্রেট দেখা যাবে।
  6. Download JSON-এ ক্লিক করুন, এরপর OK চাপুন । নতুন তৈরি করা ক্রেডেনশিয়ালটি OAuth 2.0 Client IDs-এর অধীনে দেখা যাবে।
  7. ডাউনলোড করা JSON ফাইলটি credentials.json নামে সংরক্ষণ করুন এবং ফাইলটি আপনার ওয়ার্কিং ডিরেক্টরিতে নিয়ে যান।
  8. Create Credentials > API Key-তে ক্লিক করুন এবং API কী-টি নোট করে নিন।

আরও জানতে ‘অ্যাক্সেস ক্রেডেনশিয়াল তৈরি করুন’ দেখুন।

OAuth স্কোপ কনফিগার করুন

আপনার প্রোজেক্টের বিদ্যমান OAuth স্কোপগুলোর ওপর নির্ভর করে, আপনাকে অতিরিক্ত স্কোপ কনফিগার করতে হতে পারে।

  1. OAuth সম্মতি স্ক্রিনে যান।
  2. স্কোপস স্ক্রিনে যেতে এডিট অ্যাপ > সেভ অ্যান্ড কন্টিনিউ-এ ক্লিক করুন।
  3. স্কোপ যোগ বা অপসারণ করতে ক্লিক করুন।
  4. নিম্নলিখিত স্কোপগুলি যোগ করুন, যদি আপনার কাছে সেগুলি আগে থেকে না থাকে:
    • https://www.googleapis.com/auth/classroom.coursework.students
    • https://www.googleapis.com/auth/classroom.courses
  5. তারপর আপডেট > সংরক্ষণ করুন এবং চালিয়ে যান > সংরক্ষণ করুন এবং চালিয়ে যান > ড্যাশবোর্ডে ফিরে যান-এ ক্লিক করুন।

আরও জানতে OAuth সম্মতি স্ক্রিন কনফিগার করুন দেখুন।

classroom.coursework.students স্কোপটি রুব্রিকগুলিতে ( CourseWork এর অ্যাক্সেসের পাশাপাশি) পড়া ও লেখার অ্যাক্সেস দেয়, এবং classroom.courses স্কোপটি কোর্সগুলি পড়া ও লেখার সুযোগ দেয়।

একটি নির্দিষ্ট মেথডের জন্য প্রয়োজনীয় স্কোপগুলো সেই মেথডের রেফারেন্স ডকুমেন্টেশনে তালিকাভুক্ত করা থাকে। উদাহরণস্বরূপ courses.courseWork.rubrics.create অথরাইজেশন স্কোপগুলো দেখুন। আপনি OAuth 2.0 Scopes for Google APIs- এ সমস্ত ক্লাসরুম স্কোপ দেখতে পারেন।

নমুনাটি কনফিগার করুন

আপনার ওয়ার্কিং ডিরেক্টরিতে পাইথনের জন্য গুগল ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন:

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

main.py নামে একটি ফাইল তৈরি করুন যা ক্লায়েন্ট লাইব্রেরি বিল্ড করবে এবং ব্যবহারকারীকে অনুমোদন দেবে, এক্ষেত্রে YOUR_API_KEY এর জায়গায় আপনার এপিআই কী (API key) ব্যবহার করুন।

import json
import os.path

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

# If modifying these scopes, delete the file token.json.
SCOPES = ['https://www.googleapis.com/auth/classroom.courses',
          'https://www.googleapis.com/auth/classroom.coursework.students']

def build_authenticated_service(api_key):
    """Builds the Classroom service."""
    creds = None
    # The file token.json stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run.
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        # Build the Classroom service.
        service = build(
            serviceName="classroom",
            version="v1",
            credentials=creds,
            discoveryServiceUrl=f"https://classroom.googleapis.com/$discovery/rest?labels=DEVELOPER_PREVIEW&key={api_key}")

        return service

    except HttpError as error:
        print('An error occurred: %s' % error)

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

python main.py ব্যবহার করে স্ক্রিপ্টটি চালান। আপনাকে সাইন ইন করতে এবং OAuth স্কোপগুলিতে সম্মতি দিতে বলা হবে।

একটি অ্যাসাইনমেন্ট তৈরি করুন

একটি রুব্রিক একটি অ্যাসাইনমেন্ট বা CourseWork সাথে যুক্ত থাকে এবং এটি শুধুমাত্র সেই CourseWork প্রেক্ষাপটেই অর্থবহ হয়। রুব্রিক শুধুমাত্র সেই গুগল ক্লাউড প্রজেক্ট দ্বারা তৈরি করা যায়, যেটি মূল CourseWork আইটেমটি তৈরি করেছে । এই নির্দেশিকার উদ্দেশ্যে, একটি স্ক্রিপ্ট ব্যবহার করে একটি নতুন CourseWork অ্যাসাইনমেন্ট তৈরি করুন।

main.py তে নিম্নলিখিতটি যোগ করুন:

def get_latest_course(service):
    """Retrieves the last created course."""
    try:
        response = service.courses().list(pageSize=1).execute()
        courses = response.get("courses", [])
        if not courses:
            print("No courses found. Did you remember to create one in the UI?")
            return
        course = courses[0]
        return course

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

def create_coursework(service, course_id):
    """Creates and returns a sample coursework."""
    try:
        coursework = {
            "title": "Romeo and Juliet analysis.",
            "description": """Write a paper arguing that Romeo and Juliet were
                                time travelers from the future.""",
            "workType": "ASSIGNMENT",
            "state": "PUBLISHED",
        }
        coursework = service.courses().courseWork().create(
            courseId=course_id, body=coursework).execute()
        return coursework

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

এখন আপনার তৈরি করা টেস্ট ক্লাসের course_id নেওয়ার জন্য main.py আপডেট করুন, একটি নতুন নমুনা অ্যাসাইনমেন্ট তৈরি করুন এবং অ্যাসাইনমেন্টটির coursework_id সংগ্রহ করুন:

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    course = get_latest_course(service)
    course_id = course.get("id")
    course_name = course.get("name")
    print(f"'{course_name}' course ID: {course_id}")

    coursework = create_coursework(service, course_id)
    coursework_id = coursework.get("id")
    print(f"Assignment created with ID {coursework_id}")

    #TODO(developer): Save the printed course and coursework IDs.

course_id এবং coursework_id সংরক্ষণ করুন। সমস্ত রুব্রিক CRUD অপারেশনের জন্য এগুলি প্রয়োজন।

এখন আপনার ক্লাসরুমে একটি নমুনা CourseWork থাকার কথা।

ক্লাসরুম UI-তে একটি অ্যাসাইনমেন্টের দৃশ্য চিত্র ২. ক্লাসরুমে একটি নমুনা অ্যাসাইনমেন্টের দৃশ্য।

ব্যবহারকারীর যোগ্যতা যাচাই করুন

রুব্রিক তৈরি ও আপডেট করার জন্য অনুরোধকারী ব্যবহারকারী এবং সংশ্লিষ্ট কোর্স মালিক, উভয়েরই একটি Google Workspace for Education Plus লাইসেন্স থাকা আবশ্যক। একজন ব্যবহারকারী কোন কোন সুবিধা ব্যবহার করতে পারবেন, তা ডেভেলপারদের নির্ধারণ করতে সাহায্য করার জন্য ক্লাসরুম একটি ইউজার এলিজিবিলিটি এন্ডপয়েন্ট সমর্থন করে।

আপনার টেস্ট অ্যাকাউন্টের রুব্রিক্স সক্ষমতা ব্যবহারের অনুমতি আছে কিনা তা নিশ্চিত করতে main.py আপডেট করে চালান:

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    capability = service.userProfiles().checkUserCapability(
        userId='me',
        # Specify the preview version. checkUserCapability is
        # supported in V1_20240930_PREVIEW and later.
        previewVersion="V1_20240930_PREVIEW",
        capability="CREATE_RUBRIC").execute()

    if not capability.get('allowed'):
      print('User ineligible for rubrics creation.')
      # TODO(developer): in a production app, this signal could be used to
      # proactively hide any rubrics related features from users or encourage
      # them to upgrade to the appropriate license.
    else:
      print('User eligible for rubrics creation.')

একটি রুব্রিক তৈরি করুন

এখন আপনি রুব্রিক পরিচালনা শুরু করার জন্য প্রস্তুত।

একটি CourseWork এ সম্পূর্ণ রুব্রিক অবজেক্ট সম্বলিত একটি create() কল ব্যবহার করে একটি রুব্রিক তৈরি করা যেতে পারে, যেখানে ক্রাইটেরিয়া এবং লেভেলের জন্য ID প্রোপার্টিগুলো বাদ দেওয়া হয় (এগুলো তৈরির সময় জেনারেট করা হয়)।

main.py তে নিম্নলিখিত ফাংশনটি যোগ করুন:

def create_rubric(service, course_id, coursework_id):
    """Creates an example rubric on a coursework."""
    try:
        body = {
            "criteria": [
                {
                    "title": "Argument",
                    "description": "How well structured your argument is.",
                    "levels": [
                        {"title": "Convincing",
                         "description": "A compelling case is made.", "points": 30},
                        {"title": "Passable",
                         "description": "Missing some evidence.", "points": 20},
                        {"title": "Needs Work",
                         "description": "Not enough strong evidence..", "points": 0},
                    ]
                },
                {
                    "title": "Spelling",
                    "description": "How well you spelled all the words.",
                    "levels": [
                        {"title": "Perfect",
                         "description": "No mistakes.", "points": 20},
                        {"title": "Great",
                         "description": "A mistake or two.", "points": 15},
                        {"title": "Needs Work",
                         "description": "Many mistakes.", "points": 5},
                    ]
                },
                {
                    "title": "Grammar",
                    "description": "How grammatically correct your sentences are.",
                    "levels": [
                        {"title": "Perfect",
                         "description": "No mistakes.", "points": 20},
                        {"title": "Great",
                         "description": "A mistake or two.", "points": 15},
                        {"title": "Needs Work",
                         "description": "Many mistakes.", "points": 5},
                    ]
                },
            ]
        }

        rubric = service.courses().courseWork().rubrics().create(
            courseId=course_id, courseWorkId=coursework_id, body=body
            ).execute()
        print(f"Rubric created with ID {rubric.get('id')}")
        return rubric

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

এরপর, আপনার আগের Course এবং CourseWork আইডিগুলো ব্যবহার করে উদাহরণ রুব্রিকটি তৈরি করতে main.py আপডেট ও রান করুন:

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    capability = service.userProfiles().checkUserCapability(
        userId='me',
        # Specify the preview version. checkUserCapability is
        # supported in V1_20240930_PREVIEW and later.
        previewVersion="V1_20240930_PREVIEW",
        capability="CREATE_RUBRIC").execute()

    if not capability.get('allowed'):
      print('User ineligible for rubrics creation.')
      # TODO(developer): in a production app, this signal could be used to
      # proactively hide any rubrics related features from users or encourage
      # them to upgrade to the appropriate license.
    else:
      rubric = create_rubric(service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
      print(json.dumps(rubric, indent=4))

রুব্রিক উপস্থাপনা সম্পর্কে কিছু বিষয়:

  • ক্রাইটেরিয়ন ও লেভেলের ক্রম ক্লাসরুম UI-তে প্রতিফলিত হয়।
  • স্কোর করা লেভেলগুলো (যেগুলোর points বৈশিষ্ট্য রয়েছে), অবশ্যই পয়েন্ট অনুসারে আরোহী বা অবরোহী ক্রমে সাজাতে হবে (এগুলো এলোমেলোভাবে সাজানো যাবে না)।
  • শিক্ষকরা UI-তে মানদণ্ড এবং স্কোর করা স্তরগুলো (কিন্তু স্কোর না করা স্তরগুলো নয়) পুনর্বিন্যাস করতে পারেন, এবং এর ফলে ডেটাতে সেগুলোর ক্রম পরিবর্তিত হয়।

রুব্রিকের গঠন সম্পর্কে আরও সতর্কতার জন্য সীমাবদ্ধতাগুলো দেখুন।

UI-তে ফিরে গেলে, আপনি অ্যাসাইনমেন্টের মূল্যায়ন নির্দেশিকাটি দেখতে পাবেন।

ক্লাসরুম UI-তে রুব্রিকের দৃশ্য চিত্র ৩. শ্রেণিকক্ষের অ্যাসাইনমেন্টের একটি নমুনা মূল্যায়ন নির্দেশিকা।

একটি রুব্রিক পড়ুন

সাধারণ list() এবং get() মেথড ব্যবহার করে রুব্রিকগুলো পড়া যায়।

একটি অ্যাসাইনমেন্টে সর্বাধিক একটি রুব্রিক থাকতে পারে, তাই list() ব্যবহার করা সহজ মনে নাও হতে পারে, কিন্তু আপনার কাছে যদি আগে থেকেই রুব্রিক আইডি না থাকে তবে এটি সহায়ক। যদি কোনো CourseWork সাথে কোনো রুব্রিক যুক্ত না থাকে, তাহলে list() ফাংশনটির ফলাফল খালি থাকে।

main.py তে নিম্নলিখিত ফাংশনটি যোগ করুন:

def get_rubric(service, course_id, coursework_id):
    """
    Get the rubric on a coursework. There can only be at most one.
    Returns null if there is no rubric.
    """
    try:
        response = service.courses().courseWork().rubrics().list(
            courseId=course_id, courseWorkId=coursework_id
            ).execute()

        rubrics = response.get("rubrics", [])
        if not rubrics:
            print("No rubric found for this assignment.")
            return
        rubric = rubrics[0]
        return rubric

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

আপনার যোগ করা রুব্রিকটি আনতে main.py আপডেট করে চালান:

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    rubric = get_rubric(service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
    print(json.dumps(rubric, indent=4))

    #TODO(developer): Save the printed rubric ID.

পরবর্তী ধাপগুলোর জন্য রুব্রিক-এ থাকা id প্রপার্টিটি নোট করুন।

রুব্রিক আইডি জানা থাকলে Get() ভালোভাবে কাজ করে। এর পরিবর্তে ফাংশনের মধ্যে get() ব্যবহার করলে তা দেখতে এইরকম হতে পারে:

def get_rubric(service, course_id, coursework_id, rubric_id):
    """
    Get the rubric on a coursework. There can only be at most one.
    Returns a 404 if there is no rubric.
    """
    try:
        rubric = service.courses().courseWork().rubrics().get(
            courseId=course_id,
            courseWorkId=coursework_id,
            id=rubric_id
        ).execute()

        return rubric

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

এই ইমপ্লিমেন্টেশনটি রুব্রিক না থাকলে একটি 404 রিটার্ন করে।

একটি রুব্রিক আপডেট করুন

একটি রুব্রিক আপডেট করা হয় patch() কল ব্যবহার করে। রুব্রিকের জটিল কাঠামোর কারণে, আপডেটগুলো অবশ্যই read-modify-write প্যাটার্নে করতে হবে, যেখানে সম্পূর্ণ criteria প্রপার্টিটি প্রতিস্থাপন করা হয়।

আপডেট করার নিয়মগুলো নিম্নরূপ:

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

একটি রুব্রিক আপডেট করার জন্য একটি ফাংশন যোগ করুন:

def update_rubric(service, course_id, coursework_id, rubric_id, body):
    """
    Updates the rubric on a coursework.
    """
    try:
        rubric = service.courses().courseWork().rubrics().patch(
            courseId=course_id,
            courseWorkId=coursework_id,
            id=rubric_id,
            body=body,
            updateMask='criteria'
        ).execute()

        return rubric

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

এই উদাহরণে, updateMask ব্যবহার করে criteria ফিল্ডটি পরিবর্তনের জন্য নির্দিষ্ট করা হয়েছে।

এরপর, উপরে উল্লিখিত প্রতিটি আপডেট নিয়মের জন্য পরিবর্তন করতে main.py পরিমার্জন করুন:

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    capability = service.userProfiles().checkUserCapability(
        userId='me',
        # Specify the preview version. checkUserCapability is
        # supported in V1_20240930_PREVIEW and later.
        previewVersion="V1_20240930_PREVIEW",
        capability="CREATE_RUBRIC").execute()

    if not capability.get('allowed'):
      print('User ineligible for rubrics creation.')
      # TODO(developer): in a production app, this signal could be used to
      # proactively hide any rubrics related features from users or encourage
      # them to upgrade to the appropriate license.
    else:
        # Get the latest rubric.
        rubric = get_rubric(service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
        criteria = rubric.get("criteria")
        """
        The "criteria" property should look like this:
        [
            {
                "id": "NkEyMdMyMzM2Nxkw",
                "title": "Argument",
                "description": "How well structured your argument is.",
                "levels": [
                    {
                        "id": "NkEyMdMyMzM2Nxkx",
                        "title": "Convincing",
                        "description": "A compelling case is made.",
                        "points": 30
                    },
                    {
                        "id": "NkEyMdMyMzM2Nxky",
                        "title": "Passable",
                        "description": "Missing some evidence.",
                        "points": 20
                    },
                    {
                        "id": "NkEyMdMyMzM2Nxkz",
                        "title": "Needs Work",
                        "description": "Not enough strong evidence..",
                        "points": 0
                    }
                ]
            },
            {
                "id": "NkEyMdMyMzM2Nxk0",
                "title": "Spelling",
                "description": "How well you spelled all the words.",
                "levels": [...]
            },
            {
                "id": "NkEyMdMyMzM2Nxk4",
                "title": "Grammar",
                "description": "How grammatically correct your sentences are.",
                "levels": [...]
            }
        ]
        """

        # Make edits. This example will make one of each type of change.

        # Add a new level to the first criteria. Levels must remain sorted by
        # points.
        new_level = {
            "title": "Profound",
            "description": "Truly unique insight.",
            "points": 50
        }
        criteria[0]["levels"].insert(0, new_level)

        # Remove the last criteria.
        del criteria[-1]

        # Update the criteria titles with numeric prefixes.
        for index, criterion in enumerate(criteria):
            criterion["title"] = f"{index}: {criterion['title']}"

        # Resort the levels from descending to ascending points.
        for criterion in criteria:
            criterion["levels"].sort(key=lambda level: level["points"])

        # Update the rubric with a patch call.
        new_rubric = update_rubric(
            service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID, YOUR_RUBRIC_ID, rubric)

        print(json.dumps(new_rubric, indent=4))

পরিবর্তনগুলো এখন ক্লাসরুমে শিক্ষকের জন্য প্রতিফলিত হওয়া উচিত।

ক্লাসরুম UI-তে একটি হালনাগাদকৃত রুব্রিকের দৃশ্য চিত্র ৪। হালনাগাদকৃত মূল্যায়ন নির্দেশিকার দৃশ্য।

রুব্রিক-গ্রেড করা জমাগুলি দেখুন

আপাতত, এপিআই (API) ব্যবহার করে শিক্ষার্থীদের জমা দেওয়া কাজ রুব্রিক দিয়ে মূল্যায়ন করা যাবে না, কিন্তু ক্লাসরুম ইউআই (Classroom UI)-তে রুব্রিক দিয়ে মূল্যায়ন করা জমা দেওয়া কাজগুলোর গ্রেড আপনি দেখতে পারবেন।

শিক্ষার্থী হিসেবে ক্লাসরুম UI-তে আপনার নমুনা অ্যাসাইনমেন্টটি সম্পূর্ণ করে জমা দিন । তারপর শিক্ষক হিসেবে, রুব্রিক ব্যবহার করে অ্যাসাইনমেন্টটি হাতে-কলমে মূল্যায়ন করুন

ক্লাসরুম UI-তে রুব্রিক গ্রেডের দৃশ্য চিত্র ৫. মূল্যায়ন চলাকালীন রুব্রিকটির শিক্ষকীয় দৃশ্য।

রুব্রিক ব্যবহার করে মূল্যায়ন করা StudentSubmissions দুটি নতুন প্রপার্টি যুক্ত হয়েছে: draftRubricGrades এবং assignedRubricGrades , যা যথাক্রমে ড্রাফট এবং অ্যাসাইনড গ্রেডিং পর্যায়ে শিক্ষক কর্তৃক নির্বাচিত পয়েন্ট এবং লেভেল নির্দেশ করে।

মূল্যায়ন করা জমাগুলো দেখার জন্য আপনি studentSubmissions.get() এবং studentSubmissions.list() মেথডগুলো ব্যবহার করতে পারেন।

শিক্ষার্থীদের জমা দেওয়া কাজগুলো তালিকাভুক্ত করতে main.py তে নিম্নলিখিত ফাংশনটি যোগ করুন:

def get_latest_submission(service, course_id, coursework_id):
    """Retrieves the last submission for an assignment."""
    try:
        response = service.courses().courseWork().studentSubmissions().list(
            courseId = course_id,
            courseWorkId = coursework_id,
            pageSize=1
        ).execute()
        submissions = response.get("studentSubmissions", [])
        if not submissions:
            print(
                """No submissions found. Did you remember to turn in and grade
                   the assignment in the UI?""")
            return
        submission = submissions[0]
        return submission

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

এরপর জমা দেওয়া গ্রেডগুলো দেখার জন্য main.py আপডেট করে চালান।

if __name__ == '__main__':
    service = build_authenticated_service(YOUR_API_KEY)

    submission = get_latest_submission(
        service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
    print(json.dumps(submission, indent=4))

draftRubricGrades এবং assignedRubricGrades এ রয়েছে:

  • সংশ্লিষ্ট রুব্রিক মানদণ্ডগুলোর criterionId
  • শিক্ষক প্রতিটি মানদণ্ডের জন্য points বরাদ্দ করেছেন। এটি নির্বাচিত স্তর থেকে হতে পারে, তবে শিক্ষক এটি পরিবর্তনও করে দিতে পারতেন।
  • প্রতিটি মানদণ্ডের জন্য নির্বাচিত লেভেলের levelId । যদি শিক্ষক কোনো লেভেল নির্বাচন না করে থাকেন, কিন্তু তারপরেও মানদণ্ডটির জন্য পয়েন্ট বরাদ্দ করে থাকেন, তাহলে এই ফিল্ডটি উপস্থিত থাকে না।

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

একটি রুব্রিক মুছে ফেলুন

একটি সাধারণ delete() অনুরোধের মাধ্যমে একটি রুব্রিক মুছে ফেলা যায়। সম্পূর্ণতার জন্য নিম্নলিখিত কোডটিতে একটি উদাহরণ ফাংশন দেখানো হয়েছে, কিন্তু যেহেতু মূল্যায়ন ইতিমধ্যে শুরু হয়ে গেছে, আপনি বর্তমান রুব্রিকটি মুছে ফেলতে পারবেন না:

def delete_rubric(service, course_id, coursework_id, rubric_id):
    """Deletes the rubric on a coursework."""
    try:
        service.courses().courseWork().rubrics().delete(
            courseId=course_id,
            courseWorkId=coursework_id,
            id=rubric_id
        ).execute()

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error

রপ্তানি এবং আমদানি রুব্রিক

শিক্ষকদের পুনঃব্যবহারের জন্য রুব্রিকগুলো ম্যানুয়ালি গুগল স্প্রেডশিটে এক্সপোর্ট করা যেতে পারে।

কোডে রুব্রিকের মানদণ্ড নির্দিষ্ট করার পাশাপাশি, criteria পরিবর্তে রুব্রিকের মূল অংশে sourceSpreadsheetId উল্লেখ করে এই এক্সপোর্ট করা শীটগুলো থেকে রুব্রিক তৈরি এবং আপডেট করা সম্ভব।

def create_rubric_from_sheet(service, course_id, coursework_id, sheet_id):
    """Creates an example rubric on a coursework."""
    try:
        body = {
            "sourceSpreadsheetId": sheet_id
        }

        rubric = service.courses().courseWork().rubrics().create(
            courseId=course_id, courseWorkId=coursework_id, body=body
            ).execute()

        print(f"Rubric created with ID {rubric.get('id')}")
        return rubric

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error