Puan anahtarlarını kullanmaya başlama

rubric, öğretmenlerin öğrenci gönderimlerine not verirken kullanabileceği bir şablondur. Classroom API, bu değerlendirme ölçütlerini yönetmek için öğretmen adına işlem yapmanıza olanak tanır.

Classroom kullanıcı arayüzünde puan anahtarı görünümü Şekil 1. Classroom ödevindeki örnek puan anahtarı görünümü.

Bu kılavuzda, Rubrics API'nin temel kavramları ve işlevleri açıklanmaktadır. Bir değerlendirme ölçeğinin genel yapısı ve Classroom kullanıcı arayüzünde değerlendirme ölçeğiyle notlandırma hakkında bilgi edinmek için bu Yardım Merkezi makalelerine göz atın.

Ön koşullar

Bu rehberde, aşağıdakileri kullanabileceğiniz varsayılmaktadır:

Masaüstü uygulaması için kimlik bilgilerini yetkilendirme

Son kullanıcı olarak kimlik doğrulamak ve uygulamanızdaki kullanıcı verilerine erişmek için bir veya daha fazla OAuth 2.0 İstemci Kimliği oluşturmanız gerekir. İstemci kimliği, tek bir uygulamanın Google OAuth sunucularına tanıtılması için kullanılır. Uygulamanız birden fazla platformda çalışıyorsa her platform için ayrı bir istemci kimliği oluşturmanız gerekir.

  1. Google Cloud Console'da Google Cloud Kimlik bilgileri sayfasına gidin.
  2. Kimlik Bilgileri Oluştur > OAuth istemci kimliği'ni tıklayın.
  3. Uygulama türü > Masaüstü uygulaması'nı tıklayın.
  4. Ad alanına, kimliğin adını yazın. Bu ad yalnızca Google Cloud Console'da gösterilir. Örneğin, "Puan Anahtarları Önizleme istemcisi".
  5. Oluştur'u tıklayın. Yeni istemci kimliğinizi ve istemci gizli anahtarınızı gösteren OAuth istemcisi oluşturuldu ekranı gösterilir.
  6. JSON'u indir'i ve ardından Tamam'ı tıklayın. Yeni oluşturulan kimlik bilgileri OAuth 2.0 istemci kimlikleri altında görünür.
  7. İndirilen JSON dosyasını credentials.json olarak kaydedin ve dosyayı çalışma dizininize taşıyın.
  8. Kimlik bilgileri oluştur > API anahtarı'nı tıklayın ve API anahtarını not edin.

Daha fazla bilgi için Erişim kimlik bilgileri oluşturma başlıklı makaleye bakın.

OAuth kapsamlarını yapılandırma

Projenizin mevcut OAuth kapsamlarına bağlı olarak ek kapsamlar yapılandırmanız gerekebilir.

  1. OAuth izin ekranına gidin.
  2. Uygulamayı Düzenle > Kaydet ve Devam Et'i tıklayarak Kapsamlar ekranına gidin.
  3. Kapsam Ekle veya Kaldır'ı tıklayın.
  4. Henüz yoksa aşağıdaki kapsamları ekleyin:
    • https://www.googleapis.com/auth/classroom.coursework.students
    • https://www.googleapis.com/auth/classroom.courses
  5. Ardından Güncelle > Kaydet ve Devam Et > Kaydet ve Devam Et > Kontrol Paneline Dön'ü tıklayın.

Daha fazla bilgi için OAuth kullanıcı rızası ekranını yapılandırma başlıklı makaleyi inceleyin.

classroom.coursework.students kapsamı, notlandırmalara okuma ve yazma erişimi (CourseWork erişiminin yanı sıra) sağlar. classroom.courses kapsamı ise kursları okumaya ve yazmaya olanak tanır.

Belirli bir yöntem için gereken kapsamlar, yönteme ait referans belgelerinde listelenmiştir. Örnek olarak courses.courseWork.rubrics.create yetkilendirme kapsamlarına bakın. Tüm Classroom kapsamlarını Google API'leri için OAuth 2.0 Kapsamları bölümünde görebilirsiniz. API hâlâ önizleme aşamasında olduğundan burada notlandırmalardan bahsedilmiyor.

Örneği yapılandırma

Çalışma dizininizde Python için Google istemci kitaplığını yükleyin:

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

YOUR_API_KEY yerine API anahtarınızı kullanarak istemci kitaplığını oluşturan ve kullanıcıyı yetkilendiren main.py adlı bir dosya oluşturun:

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)

Komut dosyasını python main.py kullanarak çalıştırın. Oturum açmanız ve OAuth kapsamlarına izin vermeniz istenir.

Ödev oluşturma

Notlandırma sistemi, bir ödev veya CourseWork ile ilişkilendirilir ve yalnızca ilgili CourseWork bağlamında anlamlıdır. Puan anahtarları yalnızca üst CourseWork öğesini oluşturan Google Cloud projesi tarafından oluşturulabilir. Bu kılavuz kapsamında, komut dosyası içeren yeni bir CourseWork ödevi oluşturun.

main.py alanına aşağıdakileri ekleyin:

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

Şimdi, yeni oluşturduğunuz test sınıfının course_id değerini almak için main.py değerini güncelleyin, yeni bir örnek ödev oluşturun ve ödevin coursework_id değerini alın:

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 ve coursework_id dosyalarını kaydedin. Bunlar, puan anahtarı CRUD işlemlerinin tümü için gereklidir.

Artık Classroom'da örnek bir CourseWork kullanabilirsiniz.

Classroom kullanıcı arayüzünde bir ödevi görüntüleme Şekil 2. Classroom'daki örnek bir ödevin görünümü.

Puan anahtarı oluşturma

Artık puan anahtarlarını yönetmeye hazırsınız.

Puan anahtarı, CourseWork üzerinde, ölçüt ve düzeylerin kimlik özelliklerinin atlandığı (bunlar oluşturulurken oluşturulur) tam puan anahtarı nesnesini içeren bir Create çağrısıyla oluşturulabilir.

main.py dosyasına aşağıdaki işlevi ekleyin:

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,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
            ).execute()
        print(f"Rubric created with ID {rubric.get('id')}")
        return rubric

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

Ardından, daha önce oluşturduğunuz Course ve CourseWork kimliklerini kullanarak örnek notlandırmayı oluşturmak için main.py'ü güncelleyip çalıştırın:

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

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

Puan anahtarı gösterimi hakkında bazı noktalar:

  • Ölçüt ve düzey sırası, Classroom kullanıcı arayüzüne yansıtılır.
  • Puanlı seviyeler (points mülküne sahip olanlar), puana göre artan veya azalan düzende sıralanır (rastgele sıralanamaz).
  • Öğretmenler, kullanıcı arayüzünde ölçütleri ve puanlanan seviyeleri (puanlanmamış seviyeler hariç) yeniden sıralayabilir. Bu işlem, verilerin sırasını değiştirir.

Puan anahtarı yapısıyla ilgili diğer uyarılar için sınırlamalar bölümüne bakın.

Kullanıcı arayüzünde ödevin üzerindeki puan anahtarını görürsünüz.

Classroom kullanıcı arayüzünde puan anahtarı görünümü Şekil 3. Classroom ödevindeki örnek puan anahtarı görünümü.

Puan anahtarını okuma

Puan anahtarları, standart List ve Get yöntemleriyle okunabilir.

Bir ödevde en fazla bir puan anahtarı bulunabilir. Bu nedenle List seçeneğinin kullanımı sezgisel görünmeyebilir ancak puan anahtarı kimliğiniz yoksa bu seçenek yararlı olabilir. Bir CourseWork ile ilişkili notlandırma yoksa List yanıtı boş olur.

main.py dosyasına aşağıdaki işlevi ekleyin:

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,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
            ).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

Eklediğiniz puan anahtarını almak için main.py dosyasını güncelleyin ve çalıştırın:

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.

Sonraki adımlar için not bölümündeki id mülkünü not edin.

Get, notlandırma kimliğiniz olduğunda iyi çalışır. İşlevde bunun yerine Get kullanıldığında aşağıdaki gibi görünebilir:

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,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
        ).execute()

        return rubric

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

Bu uygulama, notlandırma yoksa 404 hatası döndürür.

Puan anahtarını güncelleme

Puan anahtarlarında yapılan güncellemeler Patch çağrılarıyla yapılır. Ölçeğin karmaşık yapısı nedeniyle güncellemeler, criteria mülkünün tamamının değiştirildiği bir okuma-değiştirme-yazma kalıbıyla yapılmalıdır.

Güncelleme kuralları aşağıdaki gibidir:

  1. Kimlik olmadan eklenen ölçütler veya seviyeler ekleme olarak kabul edilir.
  2. Önceki sürümde bulunmayan ölçütler veya seviyeler silme olarak kabul edilir.
  3. Mevcut kimliği olan ancak değiştirilmiş verileri içeren ölçütler veya seviyeler düzenleme olarak kabul edilir. Değiştirilmemiş özellikler olduğu gibi bırakılır.
  4. Yeni veya bilinmeyen kimlikler içeren ölçütler ya da seviyeler hata olarak kabul edilir.
  5. Yeni ölçütlerin ve seviyelerin sırası, yeni kullanıcı arayüzü sırası olarak kabul edilir (yukarıda belirtilen kısıtlamalar geçerlidir).

Puan anahtarını güncellemek için bir işlev ekleyin:

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',
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
        ).execute()

        return rubric

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

Bu örnekte criteria alanı, updateMask ile değiştirmek için belirtilmiştir.

Ardından, yukarıda belirtilen güncelleme kurallarının her biri için değişiklik yapmak üzere main.py öğesini değiştirin:

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

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

Değişiklikler artık Classroom'da öğretmene yansıtılmıştır.

Classroom kullanıcı arayüzünde güncellenmiş bir puan anahtarının görünümü Şekil 4. Güncellenen puan anahtarının görünümü.

Puan anahtarı ile not verilen gönderimleri görüntüleme

Şu anda öğrenci gönderimleri API tarafından puan anahtarıyla notlandırılamıyor ancak puan anahtarıyla notlandırılmış gönderimlerin puan anahtarı notlarını Classroom kullanıcı arayüzünde görebilirsiniz.

Classroom kullanıcı arayüzünde öğrenci olarak örnek ödevinizi tamamlayın ve teslim edin. Ardından, öğretmen olarak puan anahtarını kullanarak ödeve manuel olarak not verebilirsiniz.

Classroom kullanıcı arayüzünde puan anahtarı notu görünümü Şekil 5. Notlandırma sırasında puan anahtarının öğretmen görünümü.

Puan anahtarıyla notlandırılan öğrenci gönderimlerinde iki yeni özellik bulunur: draftRubricGrades ve assignedRubricGrades. Bu özellikler, taslak aşamasında öğretmen tarafından seçilen puanları ve seviyeleri ve atanmış notlandırma durumlarını temsil eder.

Ayrıca, ilişkili bir puan anahtarı ile gönderilen öğrenciler, not vermeden önce bile rubricId alanı içerir. Bu, CourseWork ile ilişkili en son notlandırmayı temsil eder. Öğretmenler bir notlandırmayı silip yeniden oluşturursa bu değer değişebilir.

Notlandırılmış gönderimleri görüntülemek için mevcut studentSubmissions.Get ve studentSubmissions.List yöntemlerini kullanabilirsiniz.

Öğrenci gönderimlerini listelemek için main.py işlevine aşağıdaki işlevi ekleyin:

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,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
        ).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

Ardından, gönderim notlarını görüntülemek için main.py uygulamasını güncelleyin ve çalıştırın.

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 ve assignedRubricGrades şunları içerir:

  • İlgili puan anahtarı ölçütlerinin criterionId değeri.
  • Öğretmenin her ölçüt için atadığı points. Bu, seçilen seviyeden kaynaklanabilir ancak öğretmen bu değerin üzerine de yazmış olabilir.
  • Her ölçüt için seçilen düzeyin levelId değeri. Öğretmen bir seviye seçmediyse ancak ölçüt için puan verdiyse bu alan gösterilmez.

Bu listeler yalnızca bir öğretmenin seviye seçtiği veya puan belirlediği ölçütlere ait girişleri içerir. Örneğin, bir öğretmen notlandırma sırasında yalnızca bir ölçütle etkileşim kurmayı seçerse draftRubricGrades ve assignedRubricGrades'te, notlandırma ölçeğinde birçok ölçüt olsa bile yalnızca bir öğe olur.

Puan anahtarını silme

Bir puan anahtarı, standart bir Delete isteğiyle silinebilir. Aşağıdaki kod, eksiksizlik için örnek bir işlev gösterilmektedir, ancak notlandırma başladığından geçerli puan anahtarını silemezsiniz:

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,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
        ).execute()

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

Puan anahtarlarını dışa ve içe aktarma

Puan anahtarları, öğretmenler tarafından yeniden kullanılmak üzere Google E-Tablolar'a manuel olarak dışa aktarılabilir.

Kodda puan anahtarı ölçütleri belirtmenin yanı sıra criteria yerine bir puan anahtarı gövdesinde sourceSpreadsheetId öğesini belirterek bu dışa aktarılan bu sayfalardan puan anahtarları oluşturup güncelleyebilirsiniz:

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,
            # Specify the preview version. Rubrics CRUD capabilities are
            # supported in V1_20231110_PREVIEW and later.
            previewVersion="V1_20231110_PREVIEW"
            ).execute()

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

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

Geri bildirim

Herhangi bir sorun tespit ederseniz veya varsa geri bildiriminizi paylaşın.