Zarządzanie okresami oceniania przy użyciu interfejsu Classroom API

Ten przewodnik wyjaśnia, jak używać punktów końcowych okresów oceniania w interfejsie Google Classroom API.

Przegląd

Okresy oceniania są tworzone w celu uporządkowania prac domowych, quizów i projektów w określonych zakresach dat. Interfejs Classroom API umożliwia deweloperom tworzenie, modyfikowanie i odczytywanie okresów oceniania w Classroom w imieniu administratorów i nauczycieli. Interfejsu Classroom API możesz też używać do ustawiania okresów oceniania w przypadku zadań.

Interfejs Classroom API udostępnia 2 punkty końcowe do odczytywania i zapisywania informacji o okresach oceniania na kursie:

  • GetGradingPeriodSettings: umożliwia odczytywanie ustawień okresu oceniania w kursie.
  • UpdateGradingPeriodSettings: umożliwia zarządzanie ustawieniami okresu oceniania na zajęciach przez dodawanie, modyfikowanie i usuwanie okresów oceniania oraz stosowanie skonfigurowanych okresów oceniania do wszystkich istniejących prac na zajęciach.

Wymagania dotyczące licencji i kryteria kwalifikacji

Modyfikowanie ustawień okresu oceniania na zajęciach

Aby utworzyć, zmodyfikować lub usunąć okresy oceniania w kursie za pomocą punktu końcowego UpdateGradingPeriodSettings, muszą być spełnione te warunki:

Odczytywanie ustawień okresu oceniania na zajęciach

Administratorzy domeny i nauczyciele zajęć mogą odczytywać ustawienia okresu oceniania niezależnie od przypisanej licencji. Oznacza to, że żądania wysyłane do punktu końcowego GetGradingPeriodSettings są dozwolone w imieniu dowolnego administratora domeny lub nauczyciela.

Ustawianie identyfikatora okresu oceniania w zadaniu

Nauczyciele prowadzący zajęcia mogą dodawać symbol gradingPeriodId podczas tworzenia lub aktualizowania projektu za pomocą interfejsu API, niezależnie od przypisanej licencji.

Sprawdzanie, czy użytkownik może skonfigurować okresy oceniania

Żądania do punktu końcowego userProfiles.checkUserCapability są dozwolone w imieniu każdego administratora lub nauczyciela. Określa, czy użytkownik może modyfikować okresy oceniania.

Wymagania wstępne

W tym przewodniku znajdziesz przykłady kodu w Pythonie. Zakładamy, że:

  • Projekt Google Cloud. Możesz go skonfigurować, postępując zgodnie z instrukcjami w tym przewodniku.
  • Dodano te zakresy do ekranu zgody OAuth w projekcie:
    • https://www.googleapis.com/auth/classroom.courses
    • https://www.googleapis.com/auth/classroom.coursework.students
  • Identyfikator kursu, w którym mają zostać zmodyfikowane okresy oceniania. Właściciel kursu musi mieć licencję Google Workspace for Education Plus.
  • Dostęp do danych logowania nauczyciela lub administratora z licencją Google Workspace for Education Plus. Aby tworzyć lub modyfikować zadania, musisz mieć dane logowania nauczyciela. Administratorzy nie mogą tworzyć ani modyfikować projektów, jeśli nie są nauczycielami na zajęciach.

Zarządzanie zasobem GradingPeriodSettings

Zasób GradingPeriodSettings zawiera listę poszczególnych GradingPeriods i pole logiczne o nazwie applyToExistingCoursework.

Upewnij się, że każda GradingPeriods na liście spełnia te wymagania:

  • Tytuł, data rozpoczęcia i data zakończenia: każdy okres oceniania musi mieć tytuł, datę rozpoczęcia i datę zakończenia.
  • Unikalny tytuł: każdy okres oceniania musi mieć unikalny tytuł, który nie może być taki sam jak w przypadku innych okresów oceniania na zajęciach.
  • Daty nie mogą się pokrywać: daty rozpoczęcia i zakończenia każdego okresu oceniania nie mogą się pokrywać z datami innych okresów oceniania w ramach kursu.
  • Kolejność chronologiczna: okresy oceniania muszą być wymienione w kolejności chronologicznej na podstawie dat rozpoczęcia i zakończenia.

Każdy okres oceniania otrzyma po utworzeniu identyfikator przypisany przez interfejs Classroom API.

Wartość logiczna applyToExistingCoursework to zapisane ustawienie, które umożliwia organizowanie wcześniej utworzonych zadań w okresy oceniania bez konieczności wykonywania osobnego wywołania interfejsu API w celu zmodyfikowania wartości gradingPeriodId dla każdego zadania. Jeśli ma wartość True, Classroom automatycznie ustawi wartość gradingPeriodId we wszystkich istniejących projektach, jeśli courseWork.dueDate przypada w okresie oceniania. Jeśli w przypadku projektu nie ustawiono terminu, Classroom użyje courseWork.scheduledTime. Jeśli żadne z tych pól nie jest obecne lub nie ma dopasowania w ramach dat rozpoczęcia i zakończenia istniejącego okresu oceniania, element CourseWork nie zostanie powiązany z żadnym okresem oceniania.

Określanie, czy użytkownik może modyfikować ustawienia okresu oceniania w kursie

Interfejs Classroom API udostępnia punkt końcowy userProfiles.checkUserCapability, który pomaga proaktywnie określać, czy użytkownik może wysyłać żądania do punktu końcowego UpdateGradingPeriodSettings.

Python

def check_grading_periods_update_capability(classroom_service, course_id):
    """Checks whether a user is able to create and modify grading periods in a course."""
    try:
        capability = classroom_service.userProfiles().checkUserCapability(
          userId="me",
          capability="UPDATE_GRADING_PERIOD_SETTINGS",
           # Required while the checkUserCapability method is available in the Developer Preview Program.
          previewVersion="V1_20240930_PREVIEW"
        ).execute()

        # Retrieve the `allowed` boolean from the response.
        if capability.get("allowed"):
          print("User is allowed to update grading period settings in the course.")
        else:
          print("User is not allowed to update grading period settings in the course.")
    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

Dodawanie okresów oceniania

Teraz, gdy masz pewność, że użytkownik może modyfikować ustawienia okresu oceniania w kursie, możesz zacząć wysyłać żądania do punktu końcowego UpdateGradingPeriodSettings. Wszelkie modyfikacje zasobu GradingPeriodSettings są wykonywane za pomocą punktu końcowego UpdateGradingPeriodSettings, niezależnie od tego, czy dodajesz poszczególne okresy oceniania, modyfikujesz istniejące okresy oceniania czy usuwasz okres oceniania.

Python

W tym przykładzie zasób gradingPeriodSettings jest modyfikowany, aby uwzględniał 2 okresy oceniania. Wartość logiczna applyToExistingCoursework jest ustawiona na True, co spowoduje zmianę wartości gradingPeriodId w przypadku wszystkich istniejących zadań, które mieszczą się w przedziale dat rozpoczęcia i zakończenia okresu oceniania. Pamiętaj, że updateMask zawiera oba pola. Zapisz identyfikatory poszczególnych okresów oceniania, gdy zostaną zwrócone w odpowiedzi. W razie potrzeby musisz użyć tych identyfikatorów, aby zaktualizować okresy oceniania.

def create_grading_periods(classroom_service, course_id):
    """
    Create grading periods in a course and apply the grading periods
    to existing courseWork.
    """
    try:
        body = {
          "gradingPeriods": [
            {
              "title": "First Semester",
              "start_date": {
                "day": 1,
                "month": 9,
                "year": 2023
              },
              "end_date": {
                "day": 15,
                "month": 12,
                "year": 2023
              }
            },
            {
              "title": "Second Semester",
              "start_date": {
                "day": 15,
                "month": 1,
                "year": 2024
              },
              "end_date": {
                "day": 31,
                "month": 5,
                "year": 2024
              }
            }
          ],
          "applyToExistingCoursework": True
        }
        gradingPeriodSettingsResponse = classroom_service.courses().updateGradingPeriodSettings(
          courseId=course_id,
          updateMask='gradingPeriods,applyToExistingCoursework',
          body=body
        ).execute();

        print(f"Grading period settings updated.")
        return gradingPeriodSettingsResponse

    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

Odczytywanie ustawień okresu oceniania

Dane GradingPeriodSettings są odczytywane za pomocą punktu końcowego GetGradingPeriodSettings. Każdy użytkownik, niezależnie od licencji, może odczytywać ustawienia okresów oceniania na zajęciach.

Python

def get_grading_period_settings(classroom_service, course_id):
    """Read grading periods settings in a course."""
    try:
        gradingPeriodSettings = classroom_service.courses().getGradingPeriodSettings(
          courseId=course_id).execute()
        return gradingPeriodSettings
    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

Dodawanie do listy pojedynczego okresu oceniania

Aktualizacje poszczególnych okresów oceniania muszą być przeprowadzane zgodnie ze wzorcem odczyt-modyfikacja-zapis. Oznacza to, że trzeba przestrzegać pewnych zaleceń.

  1. Odczytaj listę okresów oceniania w zasobie GradingPeriodSettings za pomocą punktu końcowego GetGradingPeriodSettings.
  2. Wprowadź wybrane zmiany na liście okresów oceniania.
  3. Wyślij listę nowych okresów oceniania w prośbie do UpdateGradingPeriodSettings.

Ten wzorzec pomoże Ci zadbać o to, aby poszczególne nazwy okresów oceniania w kursie były różne, a daty rozpoczęcia i zakończenia okresów oceniania nie pokrywały się.

Pamiętaj o tych zasadach dotyczących aktualizowania listy okresów oceniania:

  1. Okresy oceniania dodane do listy bez identyfikatora są traktowane jako dodatki.
  2. Okresy oceniania nieobecne na liście są traktowane jako usunięte.
  3. Okresy oceniania z istniejącym identyfikatorem, ale zmodyfikowanymi danymi są traktowane jako zmiany. Niezmienione właściwości pozostaną bez zmian.
  4. Okresy oceniania z nowymi lub nieznanymi identyfikatorami są traktowane jako błędy.

Python

Poniższy kod będzie oparty na przykładzie z tego przewodnika. Nowy okres oceniania zostanie utworzony z tytułem „Lato”. W treści żądania wartość logiczna applyToExistingCoursework jest ustawiona na False.

W tym celu odczytywana jest bieżąca wartość GradingPeriodSettings, do listy dodawany jest nowy okres oceniania, a wartość logiczna applyToExistingCoursework jest ustawiana na False. Pamiętaj, że okresy oceniania, które zostały już zastosowane do istniejących prac domowych, nie zostaną usunięte. W poprzednim przykładzie okresy oceniania „Semestr 1” i „Semestr 2” zostały już zastosowane do istniejących projektów i nie zostaną z nich usunięte, jeśli w kolejnych żądaniach parametr applyToExistingCoursework będzie miał wartość False.

def add_grading_period(classroom_service, course_id):
    """
    A new grading period is added to the list, but it is not applied to existing courseWork.
    """
    try:
        # Use the `GetGradingPeriodSettings` endpoint to retrieve the existing
        # grading period IDs. You will need to include these IDs in the request
        # body to make sure existing grading periods aren't deleted.
        body = {
          "gradingPeriods": [
            {
              # Specify the ID to make sure the grading period is not deleted.
              "id": "FIRST_SEMESTER_GRADING_PERIOD_ID",
              "title": "First Semester",
              "start_date": {
                "day": 1,
                "month": 9,
                "year": 2023
              },
              "end_date": {
                "day": 15,
                "month": 12,
                "year": 2023
              }
            },
            {
              # Specify the ID to make sure the grading period is not deleted.
              "id": "SECOND_SEMESTER_GRADING_PERIOD_ID",
              "title": "Second Semester",
              "start_date": {
                "day": 15,
                "month": 1,
                "year": 2024
              },
              "end_date": {
                "day": 31,
                "month": 5,
                "year": 2024
              }
            },
            {
              # Does not include an ID because this grading period is an addition.
              "title": "Summer",
              "start_date": {
                "day": 1,
                "month": 6,
                "year": 2024
              },
              "end_date": {
                "day": 31,
                "month": 8,
                "year": 2024
              }
            }
          ],
          "applyToExistingCoursework": False
        }

        gradingPeriodSettings = classroom_service.courses().updateGradingPeriodSettings(
          courseId=course_id, body=body, updateMask='gradingPeriods,applyToExistingCoursework').execute()
        return gradingPeriodSettings

    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

Przydatne wskazówki dotyczące pola logicznego applyToExistingCoursework

Pamiętaj, że wartość logiczna applyToExistingCoursework jest utrwalana, co oznacza, że jeśli w poprzednim wywołaniu interfejsu API została ustawiona na True i nie została zmieniona, kolejne aktualizacje okresów oceniania zostaną zastosowane do istniejących projektów.

Pamiętaj, że jeśli w żądaniu UpdateGradingPeriodSettings zmienisz tę wartość logiczną z True na False, tylko nowe zmiany wprowadzone w GradingPeriodSettings nie zostaną zastosowane do istniejących zajęć. Wszelkie informacje o okresie oceniania zastosowane do zadania w poprzednich wywołaniach interfejsu API, gdy wartość logiczna była ustawiona na True, nie zostaną usunięte. Warto pamiętać, że to ustawienie logiczne umożliwia powiązanie istniejących projektów z skonfigurowanymi okresami oceniania, ale nie pozwala usuwać istniejących powiązań między projektami a skonfigurowanymi okresami oceniania.

Jeśli usuniesz lub zmienisz tytuł okresu oceniania, zmiany te zostaną zastosowane do wszystkich istniejących zadań, niezależnie od ustawienia wartości logicznej applyToExistingCoursework.

Aktualizowanie pojedynczego okresu oceniania na liście

Aby zmodyfikować dane powiązane z istniejącym okresem oceniania, umieść na liście identyfikator tego okresu wraz ze zmodyfikowanymi danymi.

Python

W tym przykładzie zostanie zmodyfikowana data zakończenia okresu oceniania „Lato”. Pole applyToExistingCoursework zostanie ustawione na True. Uwaga: ustawienie tej wartości logicznej na True spowoduje zastosowanie wszystkich skonfigurowanych okresów oceniania do istniejących zadań. W poprzednim żądaniu interfejsu API wartość logiczna została ustawiona na False, aby okres oceniania „Lato” nie był stosowany do istniejących zadań. Teraz, gdy to pole logiczne ma wartość True, okres oceniania „Lato” zostanie zastosowany do wszystkich istniejących zadań, które pasują do tego kryterium.

def update_existing_grading_period(classroom_service, course_id):
    """
    An existing grading period is updated.
    """
    try:
        # Use the `GetGradingPeriodSettings` endpoint to retrieve the existing
        # grading period IDs. You will need to include these IDs in the request
        # body to make sure existing grading periods aren't deleted.
        body = {
          "gradingPeriods": [
            {
              "id": "FIRST_SEMESTER_GRADING_PERIOD_ID",
              "title": "First Semester",
              "start_date": {
                "day": 1,
                "month": 9,
                "year": 2023
              },
              "end_date": {
                "day": 15,
                "month": 12,
                "year": 2023
              }
            },
            {
              "id": "SECOND_SEMESTER_GRADING_PERIOD_ID",
              "title": "Second Semester",
              "start_date": {
                "day": 15,
                "month": 1,
                "year": 2024
              },
              "end_date": {
                "day": 31,
                "month": 5,
                "year": 2024
              }
            },
            {
              # The end date for this grading period will be modified from August 31, 2024 to September 10, 2024.
              # Include the grading period ID in the request along with the new data.
              "id": "SUMMER_GRADING_PERIOD_ID",
              "title": "Summer",
              "start_date": {
                "day": 1,
                "month": 6,
                "year": 2024
              },
              "end_date": {
                "day": 10,
                "month": 9,
                "year": 2024
              }
            }
          ],
          "applyToExistingCoursework": True
        }

        gradingPeriodSettings = classroom_service.courses().updateGradingPeriodSettings(
          courseId=course_id, body=body, updateMask='gradingPeriods,applyToExistingCoursework').execute()
        return gradingPeriodSettings

    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

Usuwanie pojedynczego okresu oceniania

Aby usunąć okres oceniania, pomiń go na liście. Pamiętaj, że jeśli okres oceniania zostanie usunięty, wszystkie odniesienia do niego w CourseWork również zostaną usunięte niezależnie od ustawienia applyToExistingCoursework.

Python

Aby kontynuować przykład z tego przewodnika, pomiń okres oceniania „Lato”, aby go usunąć.

def delete_grading_period(classroom_service, course_id):
    """
    An existing grading period is deleted.
    """
    try:
        body = {
          "gradingPeriods": [
            {
              "id": "FIRST_SEMESTER_GRADING_PERIOD_ID",
              "title": "First Semester",
              "start_date": {
                "day": 1,
                "month": 9,
                "year": 2023
              },
              "end_date": {
                "day": 15,
                "month": 12,
                "year": 2023
              }
            },
            {
              "id": "SECOND_SEMESTER_GRADING_PERIOD_ID",
              "title": "Second Semester",
              "start_date": {
                "day": 15,
                "month": 1,
                "year": 2024
              },
              "end_date": {
                "day": 31,
                "month": 5,
                "year": 2024
              }
            }
          ]
        }

        gradingPeriodSettings = classroom_service.courses().updateGradingPeriodSettings(
          courseId=course_id, body=body, updateMask='gradingPeriods').execute()
        return gradingPeriodSettings

    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

Zarządzanie polem gradingPeriodId w materiałach dydaktycznych

Zasób CourseWork zawiera pole gradingPeriodId. Możesz używać punktów końcowych CourseWork do odczytywania i zapisywania okresu oceniania powiązanego z CourseWork. To powiązanie można zarządzać na 3 sposoby:

  • automatyczne przypisywanie okresu oceniania na podstawie daty,
  • niestandardowy powiązany okres oceniania,
  • brak powiązania z okresem oceniania

1. Powiązanie okresu oceniania z datą

Podczas tworzenia projektu możesz zezwolić Classroom na obsługę powiązania okresu oceniania. Aby to zrobić, pomiń pole gradingPeriodId w żądaniu CourseWork. Następnie w żądaniu CourseWork określ pola dueDate lub scheduledTime. Jeśli dueDate mieści się w zakresie dat istniejącego okresu oceniania, Classroom ustawi identyfikator tego okresu oceniania w zadaniu. Jeśli pole dueDate nie zostanie określone, Classroom określi wartość gradingPeriodId na podstawie pola scheduledTime. Jeśli żadne z tych pól nie zostanie określone lub jeśli nie będzie pasować żaden zakres dat okresu oceniania, w przypadku elementu CourseWork nie zostanie ustawiona żadna wartość gradingPeriodId.

2. Niestandardowy powiązany okres oceniania

Jeśli chcesz powiązać projekt z innym okresem oceniania niż ten, który jest zgodny z dueDate lub scheduledTime, możesz ręcznie ustawić pole gradingPeriodId podczas tworzenia lub aktualizowania projektu. Jeśli ręcznie ustawisz gradingPeriodId, Classroom nie będzie automatycznie przypisywać okresów oceniania na podstawie daty.

3. Brak powiązania z okresem oceniania

Jeśli nie chcesz, aby zadanie było powiązane z żadnym okresem oceniania, ustaw pole gradingPeriodId w żądaniu zadania na pusty ciąg znaków (gradingPeriodId: "").

Jeśli używasz języka programowania Go i nie chcesz ustawiać okresu oceniania, w treści żądania uwzględnij też pole ForceSendFields. W przypadku biblioteki klienta Go wartości domyślne są pomijane w żądaniach interfejsu API ze względu na obecność tagu pola omitempty we wszystkich polach. Pole ForceSendFields pomija ten proces i wysyła pusty ciąg znaków, aby wskazać, że nie chcesz ustawiać okresu oceniania dla tego zadania. Więcej informacji znajdziesz w dokumentacji biblioteki klienta interfejsów API Google w języku Go.

Przeczytaj

courseWork := &classroom.CourseWork{
  Title: "Homework questions",
  WorkType: "ASSIGNMENT",
  State: "DRAFT",
  // ...other CourseWork fields...
  GradingPeriodId: "",
  ForceSendFields: []string{"GradingPeriodId"},
}

Co się stanie z identyfikatorem okresu oceniania, jeśli data ukończenia zostanie zaktualizowana?

Jeśli aktualizujesz pole dueDate obiektu CourseWork i chcesz zachować niestandardowe powiązanie z okresem oceniania lub brak takiego powiązania, w updateMask i treści żądania uwzględnij pola dueDate i gradingPeriodId. Dzięki temu Classroom nie zastąpi gradingPeriodId okresem oceniania, który pasuje do nowego dueDate.

Python

body = {
  "dueDate": {
    "month": 6,
    "day": 10,
    "year": 2024
  },
  "dueTime": {
    "hours": 7
  },
  "gradingPeriodId": "<INSERT-GRADING-PERIOD-ID-OR-EMPTY-STRING>"
}
courseWork = classroom_service.courses().courseWork().patch(
  courseId=course_id, id=coursework_id, body=body,
  updateMask='dueDate,dueTime,gradingPeriodId') # include the gradingPeriodId field in the updateMask
.execute()