إدارة مهام الدورة الدراسية والدرجات

تتوافق واجهة مستخدم Classroom مع خمسة أنواع من الواجبات الدراسية: "المهام الدراسية"، مهام الاختبار وأسئلة الإجابات القصيرة وأسئلة الاختيار من متعدد المواد. تتيح واجهة Classroom API حاليًا ثلاثة من هذه الأنواع، وهي تُعرف باسم CourseWorkType لواجهة برمجة التطبيقات: "المهام الدراسية" و"الإجابات القصيرة" وأسئلة الاختيار من متعدد.

للوصول إلى هذه الوظيفة، يمكنك استخدام مورد CourseWork، الذي يمثل مهمة أو سؤال تم تعيينه للطلاب في دورة تدريبية معينة، بما في ذلك أي مواد وتفاصيل إضافية، مثل موعد التاريخ أو الحد الأقصى للنقاط.

بالإضافة إلى مورد CourseWork، يمكنك إدارة المهام المكتملة باستخدام المرجع StudentSubmission. تصف الأقسام التالية هذه بمزيد من التفصيل.

إنشاء المهام الدراسية

يمكن إنشاء المهام الدراسية فقط نيابةً عن معلّمي الدورة التدريبية. محاولة إنشاء مهام في دورة تدريبية نيابةً عن طالب في خطأ 403 PERMISSION_DENIED. وبالمثل، لا يمكن لمشرفي النطاق إنشاء المهام الدراسية للدورات التدريبية التي لا يدرسونها ويحاولون إجراء ذلك من خلال واجهة برمجة التطبيقات سيؤدي أيضًا إلى ظهور الخطأ 403 PERMISSION_DENIED.

عند إنشاء المهام الدراسية باستخدام طريقة courses.courseWork.create، يمكنك إجراء ما يلي: يمكنك إرفاق روابط مثل materials، كما هو موضح في نموذج الرمز أدناه:

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

تتضمن النتيجة معرّفًا تم تعيينه بواسطة الخادم ويمكن استخدامه للإشارة إلى التعيين في طلبات واجهة برمجة التطبيقات الأخرى.

لتضمين المواد المرتبطة في مهمة تم إنشاؤها عبر Classroom API، استخدام مورد للرابط، مع تحديد عنوان URL المستهدف. يجلب Classroom تلقائيًا العنوان والصورة المصغّرة. كما تدعم Classroom API في الأصل مواد Google Drive وYouTube، والتي يمكنها التي تم تضمينها مع مورد DriveFile أو مرجع YouTube Video الطريقة.

لتحديد تاريخ تسليم، اضبط الحقلين dueDate وdueTime على بالتوقيت العالمي المنسق المقابل. يجب أن يكون تاريخ التسليم في المستقبل.

استرداد المهام والأسئلة

يمكنك استرداد المهام والأسئلة للطلاب والمعلّمين في الدورة التدريبية المقابلة أو من قبل مشرف النطاق. لاسترداد نوع محدد أو مهمة دراسية أو سؤال، استخدِمطرق الخيار "courses.courseWork.get" لاسترداد الكل المهام أو الأسئلة (مطابقة بعض المعايير اختياريًا)، واستخدم courses.courseWork.list.

يعتمد النطاق المطلوب على الدور الذي يقوم به المستخدم مقدم الطلب في دورة سابقة. إذا كان المستخدم طالبًا، يمكنك استخدام أحد النطاقات التالية:

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

إذا كان المستخدم معلِّمًا أو مشرف نطاق، يمكنك استخدام أحد الخيارات التالية: النطاقات:

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

لا يعني الحصول على إذن باسترداد مهمة دراسية أو سؤال أذونات الوصول إلى المواد أو بيانات التعريف الخاصة بالمواد. عمليًا، يعني هذا حتى لا يرى المشرف عنوان ملف Drive المرفق إذا لست عضوًا في الدورة التدريبية. إذا أردت السماح للمشرفين بالوصول إلى قائمة المستخدمين ، راجع القسم على مستوى النطاق التفويض الدليل.

إدارة ردود الطلاب

StudentSubmission العمل المنجز ودرجة الطالب في مهمة ما أو السؤال. StudentSubmission بشكل ضمني لكل طالب عند طرح سؤال أو إنشاء المهمة.

توضّح الأقسام التالية الإجراءات الشائعة التي يمكن من خلالها إدارة ردود الطلاب.

استرداد ردود الطلاب

يمكن للطلاب استرداد المهام التي أرسلوها بأنفسهم، كما يستطيع المعلّمون استرداد المهام التي تم إرسالها لجميع الطلاب في دوراتهم التدريبية، ويمكن لمشرفي النطاقات استرداد جميع عمليات الإرسال لجميع الطلاب في نطاقهم. تكون كل عملية إرسال طالب تم تعيين معرِّف إذا كنت تعرف المعرف، فاستخدم courses.courseWork.studentSubmissions.get لاسترداده.

استخدم الطريقة courses.courseWork.studentSubmissions.list للحصول على موارد StudentSubmission تطابق بعض المعايير، كما هو موضح في النموذج التالي:

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
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(
          "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)

استرداد موارد StudentSubmission التي تخص طالبًا معينًا من خلال لتحديد المعلمة userId، كما هو موضح في النموذج التالي:

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
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(
          "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")

يتم التعرّف على الطلاب من خلال المعرّف الفريد أو عنوان البريد الإلكتروني للمستخدم، التي تعرضها حزمة تطوير البرامج (SDK) لوحدة تحكُّم المشرف في Google. قد يشير المستخدم الحالي أيضًا إلى طلبات البحث المعرّف باستخدام اختصار "me".

يمكن أيضًا تلقّي تسليمات من الطلاب لجميع المهام الدراسية داخل دورة سابقة. لإجراء ذلك، استخدِم الحرف "-" على أنّه courseWorkId كما هو موضّح في السمة النموذج التالي:

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

يعتمد النطاق المطلوب على الدور الذي يؤديه المستخدم الطالب في دورة سابقة. استخدام النطاق التالي إذا كان المستخدم معلّمًا أو نطاقًا المشرف:

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

استخدِم النطاق التالي إذا كان المستخدم طالبًا:

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

إنّ الحصول على إذن باسترداد المهام التي أرسلها الطالب لا يشير ضمنًا إلى الأذونات للوصول إلى المرفقات أو البيانات الوصفية للمرفقات. عمليًا، هذا يعني أنّ المشرف قد لا يرى عنوان ملف Drive المرفق في حال إذا لم يكونوا أعضاء في الدورة. إذا أردت السماح للمشرفين بالوصول إلى الحساب إلى ملفات المستخدم، فراجع دليل التفويض على مستوى النطاق.

إضافة مرفقات إلى ردّ الطالب

يمكنك إرفاق الروابط إلى المَهمّة الدراسية التي أرسلها الطالب من خلال إرفاق Link DriveFile، أو YouTubeVideo المورد. يتم ذلك باستخدام courses.courseWork.studentSubmissions.modifyAttachments، كما هو موضّح في القسم النموذج التالي:

Java

classroom/snippets/src/main/java/ModifyAttachmentsStudentSubmission.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")

يتم تحديد مرفق الرابط من خلال عنوان URL المستهدف. سيقوم Classroom تلقائيًا لجلب العنوان والصورة المصغّرة. يمكنك التعرف على المواد الأخرى في الصفحات المرجعية الخاصة بكل منها.

لا يمكن تعديل StudentSubmission إلا من قِبل معلّم الدورة التدريبية أو من خلال والطالب الذي يمتلكه. لا يمكنك إرفاق Materials إلا إذا كانت قيمة CourseWorkType لإرسال الطالب هي ASSIGNMENT.

يعتمد النطاق المطلوب على الدور الذي يقوم به المستخدم مقدم الطلب في دورة سابقة. استخدِم النطاق التالي إذا كان المستخدم معلّمًا:

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

استخدِم النطاق التالي إذا كان المستخدم طالبًا:

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

إدارة حالة ردّ الطالب

ربما يتم إلغاء إرسال رد الطالب أو تسليمه أو إرجاعه. حقل الولاية في StudentSubmission إلى الحالة الحالية. لتغيير الولاية، اتصل باستخدام إحدى الطرق التالية:

تأخذ جميع هذه الطرق نصًا فارغًا. مثال:

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

يمكن فقط للطالب الذي يملك StudentSubmission تسليمها أو استردادها. لا يمكن استرداد سوى المستند الذي تم تسليمه. يمكن لمعلمي الدورة التدريبية إرجاع StudentSubmission الذي لا يزال في حالة التسليم.

وضع درجات لردود الطلاب

يحتوي مورد StudentSubmission على حقلَين لتخزين الدرجات: وassignedGrade، وهو الدرجة التي يتم إبلاغ الطلاب بها، وdraftGrade، وهو درجة مبدئية لا تظهر سوى للمعلمين. تم تعديل هذه الحقول. استخدام courses.courseWork.studentSubmissions.patch مع قناع حقل التي تحتوي على الحقول المناسبة، كما هو موضح في النموذج التالي.

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، لا يمكن للمعلّمين تعيين درجة حتى قد حفظوا أولاً درجة أولية. يمكن بعد ذلك إرجاع الدرجة التي تم تعيينها إلى طالب. ويجب أن تحاكي التطبيقات هذا السلوك. يمكن لتطبيقك لوضع درجة على مهمة الطالب بإحدى الطريقتين التاليتين:

  • يمكنك تعيين draftGrade فقط. ويكون هذا مفيدًا، على سبيل المثال، للسماح للمعلم لمراجعة الدرجات يدويًا قبل الانتهاء منها. لا يمكن للطلاب الاطّلاع على الدرجات الأولية.

  • يمكنك تعيين كل من draftGrade وassignedGrade لوضع الدرجات على مهمة دراسية بالكامل.

إدراج الدرجات التي تم تعيينها

يمكنك سرد جميع الدرجات لعنصر معين من مهام الدورة من خلال استكشاف كائن استجابة الطريقة courses.courseWork.studentSubmissions.list:

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'))}")