Sınıf Çalışmalarını ve Notları Yönetme

Classroom kullanıcı arayüzü, beş sınıf sınıf türünü destekler: Ödevler, Test Ödevleri, Kısa yanıtlı sorular, Çoktan seçmeli sorular ve Materyaller. Classroom API şu anda bu türlerden üçünü desteklemektedir. Bunlar API için CourseWorkType olarak bilinir: Ödevler, Kısa yanıt soruları ve Çoktan seçmeli sorular.

Bu işleve erişmek için teslim tarihi veya maksimum puan gibi tüm ek materyaller ve ayrıntılar dahil olmak üzere belirli bir dersteki öğrencilere atanmış olan Ödev veya Soruyu temsil eden CourseWork kaynağını kullanabilirsiniz.

CourseWork kaynağına ek olarak, tamamlanmış ödevleri StudentSubmission kaynağıyla yönetebilirsiniz. Aşağıdaki bölümlerde bu işlemler daha ayrıntılı olarak açıklanmaktadır.

Ödev oluşturma

Ödevler yalnızca ders öğretmenlerinin adına oluşturulabilir ve bir öğrenci adına ödev oluşturma girişiminde bulunursanız 403 PERMISSION_DENIED hatası verilir. Benzer şekilde, alan yöneticileri, öğretmedikleri dersler için de ödev oluşturamaz ve bunu API aracılığıyla yapmaya çalışırsa 403 PERMISSION_DENIED hatası da oluşur.

courses.courseWork.create yöntemini kullanarak atama oluştururken aşağıdaki örnek kodda gösterilen bağlantıları materials olarak ekleyebilirsiniz:

Java

classroom/snippets/src/main/java/CreateCourseWork.java
CourseWork courseWork = null;
try {
  // Create a link to add as a material on course work.
  Link articleLink =
      new Link()
          .setTitle("SR-71 Blackbird")
          .setUrl("https://www.lockheedmartin.com/en-us/news/features/history/blackbird.html");

  // Create a list of Materials to add to course work.
  List<Material> materials = Arrays.asList(new Material().setLink(articleLink));

  /* Create new CourseWork object with the material attached.
  Set workType to `ASSIGNMENT`. Possible values of workType can be found here:
  https://developers.google.com/classroom/reference/rest/v1/CourseWorkType
  Set state to `PUBLISHED`. Possible values of state can be found here:
  https://developers.google.com/classroom/reference/rest/v1/courses.courseWork#courseworkstate */
  CourseWork content =
      new CourseWork()
          .setTitle("Supersonic aviation")
          .setDescription(
              "Read about how the SR-71 Blackbird, the world’s fastest and "
                  + "highest-flying manned aircraft, was built.")
          .setMaterials(materials)
          .setWorkType("ASSIGNMENT")
          .setState("PUBLISHED");

  courseWork = service.courses().courseWork().create(courseId, content).execute();

  /* Prints the created courseWork. */
  System.out.printf("CourseWork created: %s\n", courseWork.getTitle());
} catch (GoogleJsonResponseException e) {
  // TODO (developer) - handle error appropriately
  GoogleJsonError error = e.getDetails();
  if (error.getCode() == 404) {
    System.out.printf("The courseId does not exist: %s.\n", courseId);
  } else {
    throw e;
  }
  throw e;
} catch (Exception e) {
  throw e;
}
return courseWork;

Python

classroom/snippets/classroom_create_coursework.py
from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def classroom_create_coursework(course_id):

    """
    Creates the coursework the user has access to.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """

    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member

    try:
        service = build('classroom', 'v1', credentials=creds)
        coursework = {
            'title': 'Ant colonies',
            'description': '''Read the article about ant colonies
                              and complete the quiz.''',
            'materials': [
                {'link': {'url': 'http://example.com/ant-colonies'}},
                {'link': {'url': 'http://example.com/ant-quiz'}}
            ],
            'workType': 'ASSIGNMENT',
            'state': 'PUBLISHED',
        }
        coursework = service.courses().courseWork().create(
            courseId=course_id, body=coursework).execute()
        print(f"Assignment created with ID {coursework.get('id')}")
        return coursework

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


if __name__ == '__main__':
    # Put the course_id of course whose coursework needs to be created,
    # the user has access to.
    classroom_create_coursework(453686957652)

Sonuç, diğer API isteklerinde atamaya referans vermek için kullanılabilecek, sunucu tarafından atanmış bir tanımlayıcı içerir.

Bağlı materyalleri Classroom API üzerinden oluşturulan bir ödeve eklemek için hedef URL'yi belirterek bir Bağlantı kaynağı kullanın. Classroom, başlık ve küçük resmi otomatik olarak getirir. Classroom API, benzer bir şekilde bir DriveFile kaynağı veya YouTubeVideo kaynağı ile eklenebilen Google Drive ve YouTube materyallerini de yerel olarak destekler.

Son tarih belirtmek için dueDate ve dueTime alanlarını ilgili UTC saatine ayarlayın. Son tarih, gelecekteki bir tarih olmalıdır.

Ödev ve soruları alma

İlgili kursun öğrencileri veya öğretmenleri için ya da bir alan yöneticisi tarafından ödev ve soru alabilirsiniz. Belirli bir ödevi veya soruyu almak için kurslar.courseWork.get'i kullanın. Tüm ödevleri veya soruları (isteğe bağlı olarak bazı ölçütlerle eşleşir) almak içincourses.courseWork.list'i kullanın.

Gerekli kapsam, istekte bulunan kullanıcının kurstaki rolüne bağlıdır. Kullanıcı öğrenciyse aşağıdaki kapsamlardan birini kullanın:

  • https://www.googleapis.com/auth/classroom.coursework.me.readonly
  • https://www.googleapis.com/auth/classroom.coursework.me

Kullanıcı bir öğretmen veya alan yöneticisiyse aşağıdaki kapsamlardan birini kullanın:

  • https://www.googleapis.com/auth/classroom.coursework.students.readonly
  • https://www.googleapis.com/auth/classroom.coursework.students

Ödev veya soru alma izninin olması, materyallere ya da materyal meta verilerine erişim izni olduğu anlamına gelmez. Uygulamada bu, yöneticinin derse üye olmayan bir ekli Drive dosyasının başlığını görmeyebileceği anlamına gelir. Yöneticilerin kullanıcı dosyalarına erişmesine izin vermek istiyorsanız alan genelinde yetki kılavuzuna bakın.

Öğrenci yanıtlarını yönetin

StudentSubmission kaynağı, bir öğrencinin ödev veya soru için yaptığı çalışmaları ve notlarını temsil eder. Bir StudentSubmission kaynağı, yeni bir soru veya ödev oluşturulduğunda her öğrenci için dolaylı olarak oluşturulur.

Aşağıdaki bölümlerde, öğrenci yanıtlarını yöneten genel işlemler açıklanmaktadır.

Öğrenci yanıtlarını alma

Öğrenciler kendi gönderimlerini, öğretmenler ise derslerindeki tüm öğrenciler için gönderimleri alabilir. Alan yöneticileri de alanlarındaki tüm öğrenciler için tüm gönderimleri alabilir. Her öğrenci gönderimine bir tanımlayıcı atanır. Tanımlayıcıyı biliyorsanız almak için courses.courseWork.studentSubmissions.get kullanın.

Aşağıdaki örnekte gösterildiği gibi, bazı ölçütlerle eşleşen StudentSubmission kaynaklarını almak için courses.courseWork.studentSubmissions.list yöntemini kullanın:

Java

classroom/snippets/src/main/java/ListSubmissions.java
List<StudentSubmission> studentSubmissions = new ArrayList<>();
String pageToken = null;

try {
  do {
    ListStudentSubmissionsResponse response =
        service
            .courses()
            .courseWork()
            .studentSubmissions()
            .list(courseId, courseWorkId)
            .setPageToken(pageToken)
            .execute();

    /* Ensure that the response is not null before retrieving data from it to avoid errors. */
    if (response.getStudentSubmissions() != null) {
      studentSubmissions.addAll(response.getStudentSubmissions());
      pageToken = response.getNextPageToken();
    }
  } while (pageToken != null);

  if (studentSubmissions.isEmpty()) {
    System.out.println("No student submission found.");
  } else {
    for (StudentSubmission submission : studentSubmissions) {
      System.out.printf(
          "Student id (%s), student submission id (%s)\n",
          submission.getUserId(), submission.getId());
    }
  }
} catch (GoogleJsonResponseException e) {
  // TODO (developer) - handle error appropriately
  GoogleJsonError error = e.getDetails();
  if (error.getCode() == 404) {
    System.out.printf(
        "The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, courseWorkId);
  } else {
    throw e;
  }
} catch (Exception e) {
  throw e;
}
return studentSubmissions;

Python

classroom/snippets/classroom_list_submissions.py
from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def classroom_list_submissions(course_id, coursework_id):
    """
    Creates the courses the user has access to.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """

    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    submissions = []
    page_token = None

    try:
        service = build('classroom', 'v1', credentials=creds)
        while True:
            coursework = service.courses().courseWork()
            response = coursework.studentSubmissions().list(
                pageToken=page_token,
                courseId=course_id,
                courseWorkId=coursework_id,
                pageSize=10).execute()
            submissions.extend(response.get('studentSubmissions', []))
            page_token = response.get('nextPageToken', None)
            if not page_token:
                break

        if not submissions:
            print('No student submissions found.')

        print('Student Submissions:')
        for submission in submissions:
            print(f"Submitted at:"
                  f"{(submission.get('id'), submission.get('creationTime'))}")

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


if __name__ == '__main__':
    # Put the course_id and coursework_id of course whose list needs to be
    # submitted.
    classroom_list_submissions(453686957652, 466086979658)

Aşağıdaki örnekte gösterildiği gibi, userId parametresini belirterek belirli bir öğrenciye ait StudentSubmission kaynaklarını alın:

Java

classroom/snippets/src/main/java/ListStudentSubmissions.java
List<StudentSubmission> studentSubmissions = new ArrayList<>();
String pageToken = null;

try {
  do {
    // Set the userId as a query parameter on the request.
    ListStudentSubmissionsResponse response =
        service
            .courses()
            .courseWork()
            .studentSubmissions()
            .list(courseId, courseWorkId)
            .setPageToken(pageToken)
            .set("userId", userId)
            .execute();

    /* Ensure that the response is not null before retrieving data from it to avoid errors. */
    if (response.getStudentSubmissions() != null) {
      studentSubmissions.addAll(response.getStudentSubmissions());
      pageToken = response.getNextPageToken();
    }
  } while (pageToken != null);

  if (studentSubmissions.isEmpty()) {
    System.out.println("No student submission found.");
  } else {
    for (StudentSubmission submission : studentSubmissions) {
      System.out.printf("Student submission: %s.\n", submission.getId());
    }
  }

Python

classroom/snippets/classroom_list_student_submissions.py
from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def classroom_list_student_submissions(course_id, coursework_id, user_id):
    """
    Creates the courses the user has access to.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """

    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    submissions = []
    page_token = None

    try:
        service = build('classroom', 'v1', credentials=creds)
        while True:
            coursework = service.courses().courseWork()
            response = coursework.studentSubmissions().list(
                pageToken=page_token,
                courseId=course_id,
                courseWorkId=coursework_id,
                userId=user_id).execute()
            submissions.extend(response.get('studentSubmissions', []))
            page_token = response.get('nextPageToken', None)
            if not page_token:
                break

        if not submissions:
            print('No student submissions found.')

        print('Student Submissions:')
        for submission in submissions:
            print(f"Submitted at:"
                  f"{(submission.get('id'), submission.get('creationTime'))}")

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


if __name__ == '__main__':
    # Put the course_id, coursework_id and user_id of course whose list needs
    # to be submitted.
    classroom_list_student_submissions(453686957652, 466086979658, "me")

Öğrenciler, Google Yönetici SDK'sı tarafından döndürülen benzersiz kimlik veya e-posta adresiyle tanımlanır. Mevcut kullanıcı, "me" kısaltmasını kullanarak kendi kimliğine de başvurabilir.

Ayrıca, bir dersteki tüm ödevler için öğrenci gönderimleri de alabilirsiniz. Bunu yapmak için aşağıdaki örnekte gösterildiği gibi courseWorkId yerine "-" değerini kullanın:

Java

service.courses().courseWork().studentSubmissions()
    .list(courseId, "-")
    .set("userId", userId)
    .execute();

Python

service.courses().courseWork().studentSubmissions().list(
    courseId=<course ID or alias>,
    courseWorkId='-',
    userId=<user ID>).execute()

Gerekli kapsam, istekte bulunan kullanıcının kurstaki rolüne bağlıdır. Kullanıcı bir öğretmen veya alan yöneticisiyse aşağıdaki kapsamı kullanın:

  • https://www.googleapis.com/auth/classroom.coursework.students.readonly
  • https://www.googleapis.com/auth/classroom.coursework.students

Kullanıcı öğrenciyse aşağıdaki kapsamı kullanın:

  • https://www.googleapis.com/auth/classroom.coursework.me.readonly
  • https://www.googleapis.com/auth/classroom.coursework.me

Bir öğrenci gönderimini alma izninin olması, eklere veya ek meta verilerine erişim izni olduğu anlamına gelmez. Uygulamada bu, yönetici tarafından ekli Drive üyesi olmayan bir Drive dosyasının başlığını görmeyebileceği anlamına gelir. Yöneticilerin kullanıcı dosyalarına erişmesine izin vermek istiyorsanız alan genelinde yetki kılavuzunu inceleyin.

Öğrenci yanıtına dosya ekleme

Link, DriveFile veya YouTubeVideo kaynağı ekleyerek öğrenci gönderimine bağlantı ekleyebilirsiniz. Bu işlem aşağıdaki örnekte gösterildiği gibi courses.courseWork.studentSubmissions.modifyAttachments ile yapılır:

Java

classroom/snippets/src/main/java/ModifyattachsStudentSubmission.java
StudentSubmission studentSubmission = null;
try {
  // Create ModifyAttachmentRequest object that includes a new attachment with a link.
  Link link = new Link().setUrl("https://en.wikipedia.org/wiki/Irrational_number");
  Attachment attachment = new Attachment().setLink(link);
  ModifyAttachmentsRequest modifyAttachmentsRequest =
      new ModifyAttachmentsRequest().setAddAttachments(Arrays.asList(attachment));

  // The modified studentSubmission object is returned with the new attachment added to it.
  studentSubmission =
      service
          .courses()
          .courseWork()
          .studentSubmissions()
          .modifyAttachments(courseId, courseWorkId, id, modifyAttachmentsRequest)
          .execute();

  /* Prints the modified student submission. */
  System.out.printf(
      "Modified student submission attachments: '%s'.\n",
      studentSubmission.getAssignmentSubmission().getAttachments());
} catch (GoogleJsonResponseException e) {
  // TODO (developer) - handle error appropriately
  GoogleJsonError error = e.getDetails();
  if (error.getCode() == 404) {
    System.out.printf(
        "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does "
            + "not exist.\n",
        courseId, courseWorkId, id);
  } else {
    throw e;
  }
} catch (Exception e) {
  throw e;
}
return studentSubmission;

Python

classroom/snippets/classroom_add_attachment.py

def classroom_add_attachment(course_id, coursework_id, submission_id):
    """
    Adds attachment to existing course with specific course_id.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """
    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    request = {
        'addAttachments': [
            {'link': {'url': 'http://example.com/quiz-results'}},
            {'link': {'url': 'http://example.com/quiz-reading'}}
        ]
    }

    try:
        service = build('classroom', 'v1', credentials=creds)
        while True:
            coursework = service.courses().courseWork()
            coursework.studentSubmissions().modifyAttachments(
                courseId=course_id,
                courseWorkId=coursework_id,
                id=submission_id,
                body=request).execute()

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


if __name__ == '__main__':
    # Put the course_id, coursework_id and submission_id of course in which
    # attachment needs to be added.
    classroom_add_attachment('course_id', 'coursework_id', "me")

Bağlantı eki, hedef URL ile tanımlanır. Classroom, başlığı ve küçük resmi otomatik olarak getirir. Diğer materyaller hakkında kendi referans sayfalarından bilgi edinebilirsiniz.

StudentSubmission yalnızca ders öğretmeni veya ders sahibi tarafından değiştirilebilir. Materials öğesini yalnızca öğrenci gönderiminin CourseWorkType değeri ASSIGNMENT olduğunda ekleyebilirsiniz.

Gerekli kapsam, istekte bulunan kullanıcının kurstaki rolüne bağlıdır. Kullanıcı bir öğretmense aşağıdaki kapsamı kullanın:

  • https://www.googleapis.com/auth/classroom.coursework.students

Kullanıcı öğrenciyse aşağıdaki kapsamı kullanın:

  • https://www.googleapis.com/auth/classroom.coursework.me

Öğrencinin yanıt durumunu yönet

Öğrenci yanıtı iptal edilebilir, teslim edilebilir veya geri verilebilir. StudentSubmission içindeki durum alanı, mevcut durumu gösterir. Durumu değiştirmek için aşağıdaki yöntemlerden birini arayın:

Tüm bu yöntemler boş bir gövdeye sahip olur. Örnek:

Java

classroom/snippets/src/main/java/ReturnStudentSubmission.java
try {
  service
      .courses()
      .courseWork()
      .studentSubmissions()
      .classroomReturn(courseId, courseWorkId, id, null)
      .execute();
} catch (GoogleJsonResponseException e) {
  // TODO (developer) - handle error appropriately
  GoogleJsonError error = e.getDetails();
  if (error.getCode() == 404) {
    System.out.printf(
        "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does "
            + "not exist.\n",
        courseId, courseWorkId, id);
  } else {
    throw e;
  }
} catch (Exception e) {
  throw e;
}

Python

service.courses().courseWork().studentSubmission().turnIn(
    courseId=<course ID or alias>,
    courseWorkId=<courseWork ID>,
    id=<studentSubmission ID>,
    body={}).execute()

Yalnızca StudentSubmission sahibi olan öğrenci bu öğeyi teslim edebilir veya geri alabilir. Yalnızca teslim edilen bir gönderim geri alınabilir. Ders öğretmenleri yalnızca teslim edilmiş durumda olan bir StudentSubmission döndürebilir.

Öğrenci yanıtlarına not verme

StudentSubmission kaynağı, notları depolayacak iki alan içerir: Öğrencilere verilen not olan assignedGrade ve yalnızca öğretmenler tarafından görünen geçici bir not olan draftGrade. Bu alanlar, aşağıdaki örnekte gösterildiği gibi, uygun alanları içeren bir alan maskesiyle courses.courseWork.studentSubmissions.patch kullanılarak güncellenir.

Java

classroom/snippets/src/main/java/PatchStudentSubmission.java
StudentSubmission studentSubmission = null;
try {
  // Updating the draftGrade and assignedGrade fields for the specific student submission.
  StudentSubmission content =
      service
          .courses()
          .courseWork()
          .studentSubmissions()
          .get(courseId, courseWorkId, id)
          .execute();
  content.setAssignedGrade(90.00);
  content.setDraftGrade(80.00);

  // The updated studentSubmission object is returned with the new draftGrade and assignedGrade.
  studentSubmission =
      service
          .courses()
          .courseWork()
          .studentSubmissions()
          .patch(courseId, courseWorkId, id, content)
          .set("updateMask", "draftGrade,assignedGrade")
          .execute();

  /* Prints the updated student submission. */
  System.out.printf(
      "Updated student submission draft grade (%s) and assigned grade (%s).\n",
      studentSubmission.getDraftGrade(), studentSubmission.getAssignedGrade());
} catch (GoogleJsonResponseException e) {
  // TODO (developer) - handle error appropriately
  GoogleJsonError error = e.getDetails();
  if (error.getCode() == 404) {
    System.out.printf(
        "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does "
            + "not exist.\n",
        courseId, courseWorkId, id);
  } else {
    throw e;
  }
} catch (Exception e) {
  throw e;
}
return studentSubmission;

Python

studentSubmission = {
  'assignedGrade': 99,
  'draftGrade': 80
}
service.courses().courseWork().studentSubmissions().patch(
    courseId=<course ID or alias>,
    courseWorkId=<courseWork ID>,
    id=<studentSubmission ID>,
    updateMask='assignedGrade,draftGrade',
    body=studentSubmission).execute()

Classroom kullanıcı arayüzüyle çalışırken, öğretmenler ilk olarak bir taslak not kaydedene kadar not atayamazlar. Daha sonra, atanan not bir öğrenciye geri verilebilir. Uygulamaların bu davranışı taklit etmesi gerekir. Uygulamanız, bir öğrencinin ödevine iki yöntemden birini kullanarak not verebilir:

  • Yalnızca draftGrade atayın. Bu özellik, örneğin öğretmenin tamamlamadan önce notları manuel olarak incelemesine olanak tanır. Öğrenciler notlarını göremez.

  • Bir ödeve tam not vermek için draftGrade ve assignedGrade atayın.

Atanan notları listeleme

courses.courseWork.studentSubmissions.list yönteminin yanıt nesnesini inceleyerek belirli bir sınıf çalışması öğesi için tüm notları listeleyebilirsiniz:

Java

classroom/snippets/src/main/java/ListStudentSubmissions.java
  ListStudentSubmissionsResponse response =
      service
          .courses()
          .courseWork()
          .studentSubmissions()
          .list(courseId, courseWorkId)
          .setPageToken(pageToken)
          .execute();

  /* Ensure that the response is not null before retrieving data from it to avoid errors. */
  if (response.getStudentSubmissions() != null) {
    studentSubmissions.addAll(response.getStudentSubmissions());
    pageToken = response.getNextPageToken();
  }
} while (pageToken != null);

if (studentSubmissions.isEmpty()) {
  System.out.println("No student submissions found.");
} else {
  for (StudentSubmission submission : studentSubmissions) {
    System.out.printf(
        "User ID %s, Assigned grade: %s\n",
        submission.getUserId(), submission.getAssignedGrade());
  }
}

Python

response = coursework.studentSubmissions().list(
    courseId=course_id,
    courseWorkId=coursework_id,
    pageSize=10).execute()
submissions.extend(response.get('studentSubmissions', []))

if not submissions:
    print('No student submissions found.')

print('Student Submissions:')
for submission in submissions:
    print(f"Submitted at:"
          f"{(submission.get('userId'), submission.get('assignedGrade'))}")