Внешние вложения и усилитель; сдача

Это седьмое пошаговое руководство из серии руководств по использованию дополнений для класса.

В этом пошаговом руководстве вы добавите в веб-приложение функцию создания дополнительных вложений вне Google Classroom . Используйте эту функцию, чтобы позволить пользователям создавать дополнительные вложения из вашего существующего продукта или веб-сайта. Это также отличное дополнение к интеграции CourseWork , поскольку вы перенаправляете существующий трафик на улучшенный пользовательский интерфейс, предлагаемый вашим дополнением, без изменения их рабочего процесса. Рекомендуемый процесс представлен на нашей странице руководства « Создание вложений вне Classroom» .

Вы также можете добавить в свой аддон возможность программного изменения заданий, содержащих прикрепленные к нему аддоны . Вы можете изменить любое задание, содержащее один из ваших аддонов, независимо от того, кто создал это задание. Это особенно полезно для сдачи заданий после того, как ученик выполнил какое-либо задание, сигнализируя учителю о том, что назначенные задания выполнены и работа ученика готова к проверке.

Вы расширяете финальную версию своего дополнения, которая поддерживает вложения типа контента или типа действия . В этом руководстве используется вложение типа контента.

Добавьте область действия OAuth для управления назначениями.

Убедитесь, что ваше приложение запрашивает следующие области действия:

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

Область видимости classroom.coursework.students ранее не требовалась и используется для создания или изменения заданий CourseWork . Добавьте эту область видимости в списки областей видимости в SDK Google Workspace Marketplace вашего проекта Cloud, на экран согласия OAuth и в код вашего сервера.

Python

  SCOPES = [
    "https://www.googleapis.com/auth/classroom.addons.teacher",
    "https://www.googleapis.com/auth/classroom.addons.student",
    "https://www.googleapis.com/auth/classroom.coursework.students",
  ]

Создайте задание в Classroom.

Добавление кнопок на веб-страницу без использования iframe.

Описанный в этом пошаговом руководстве процесс позволяет пользователю создавать задания и вложения в Google Classroom из продукта, не принадлежащего Google. На практике это, скорее всего, ваш существующий веб-сайт или приложение. В этом примере вам нужно создать макет веб-страницы, которая будет выступать в качестве внешнего сайта. Вам нужна кнопка или ссылка, при нажатии на которую откроется новый маршрут , выполняющий предложенный процесс CourseWork для создания нового задания.

Вам также потребуется добавить кнопку или ссылку для авторизации пользователя, если у вас их еще нет. Для последующих запросов к API потребуются учетные данные пользователя, поэтому он должен пройти процедуру установления соединения OAuth 2.0. Подробные инструкции см. в пошаговом руководстве по авторизации.

Python

В приведенном примере на Python изменяется маршрут /index , который был представлен на первом шаге пошагового руководства .

<!-- /webapp/templates/index.html -->
<a href="clear-credentials.html">Logout</a>
<a href="start-auth-flow.html">Login</a>

<br>

<a href="create-coursework-assignment.html">Create a CourseWork Assignment</a>

Добавьте HTML-шаблон, представляющий собой раздел вашего сайта. Эта страница будет отображать контент, который будет прикреплен к вашему заданию CourseWork .

<!-- /webapp/templates/example-coursework-assignment.html -->
<h1>CourseWork assignment loaded!</h1>
<p>You've loaded a CourseWork assignment! It was created from an external web page.</p>

Создайте новый файл модуля Python для обработки маршрутов, связанных с курсовыми работами. В нашем примере это файл coursework_routes.py . Добавьте следующие три маршрута; обратите внимание, что вы заполните часть содержимого позже.

# /webapp/coursework_routes.py
@app.route("/create-coursework-assignment")
def create_coursework_assignment():
  """
  Completes the assignment creation flow.
  """

  # Check that the user is signed in. If not, perform the OAuth 2.0
  # authorization flow.
  credentials = get_credentials()

  if not credentials:
    return start_auth_flow("coursework_assignment_callback")

  # Construct the Google Classroom service.
  classroom_service = get_classroom_service()

  pass  # To be completed later.

@app.route("/example-coursework-assignment/<assignment_type>")
def example_coursework_assignment(assignment_type):
  """
  Renders the "example-coursework-assignment.html" template.
  """
  return flask.render_template(
      "example-coursework-assignment.html", assignment_type=assignment_type
  )

@app.route("/coursework-assignment-callback")
def coursework_assignment_callback():
  """
  Completes the OAuth 2.0 handshake and stores credentials in the session.
  This is identical to the callback introduced in the sign-in walkthrough,
  but redirects the user to the index page instead of the attachment
  discovery page.
  """
  flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
      CLIENT_SECRETS_FILE,
      scopes=SCOPES,
      state=flask.session["state"],
      redirect_uri=flask.url_for("coursework_assignment_callback", _external=True),
  )

  flow.fetch_token(authorization_response=flask.request.url)

  credentials = flow.credentials
  flask.session["credentials"] = session_credentials_to_dict(
      credentials
  )

  # Close the current window and redirect the user to the index page.
  return flask.render_template("close-me.html", redirect_destination="index")

Проверьте, имеет ли пользователь право на создание вложений.

Для создания дополнительных вложений от имени пользователя необходимо выполнить ряд предварительных условий. Для удобства Google предоставляет метод userProfiles.checkUserCapability , позволяющий определить, соответствует ли пользователь этим условиям. Пользователь, отвечающий этим условиям, называется подходящим пользователем.

Добавьте проверку соответствия требованиям в реализацию маршрута создания CourseWork . Затем протестируйте поле allowed в ответе. Для пользователей, соответствующих требованиям, следуйте логике создания задания с дополнительным вложением . В противном случае создайте ссылку на материал . Вам потребуется знать идентификатор курса, в котором пользователь хочет создать задание. Обычно вы запрашиваете у пользователя указание, какой курс использовать. Для простоты в этом примере мы используем жестко заданное значение.

Python

# /webapp/coursework_routes.py
@app.route("/create-coursework-assignment")
def create_coursework_assignment():
  """
  Completes the assignment creation flow.
  """
  # ... Check that the user is signed in and get the Classroom service ...

  # Check whether the user can create add-on attachments.
  eligibility_response = (
      classroom_service.userProfiles()
      .checkUserCapability(
        userId="me",
        capability="CREATE_ADD_ON_ATTACHMENT",
        # The previewVersion is necessary while the method is available in the
        # Workspace Developer Preview Program.
        previewVersion="V1_20240930_PREVIEW",
      ).execute()
  )
  is_create_attachment_eligible = eligibility_response.get("allowed")

  if is_create_attachment_eligible:
    # See the "Create an assignment with add-on attachment for eligible users" section for implementation.
  if not is_create_attachment_eligible:
    # See the "Create a Link Material" section for implementation.

Создайте задание с дополнительными вложениями для соответствующих пользователей.

Если пользователь имеет право создавать дополнительные вложения, выполните следующие действия:

  1. Отправьте API-запрос для создания задания courseWork в Google Classroom без вложений .
  2. Извлеките id только что созданного задания.
  3. Создайте новый объект CourseWork AddOnAttachment .
  4. Отправьте запрос на создание дополнительного вложения к только что созданному заданию в Google Classroom.

Python

# The ID of the course to which the assignment will be added.
course_id = 1234567890  # TODO(developer) Replace with an actual course ID.

# /webapp/coursework_routes.py
if is_create_attachment_eligible:
  # Create an assignment.
  coursework = {
      "title": "My CourseWork Assignment with Add-on Attachment",
      "description": "Created using the Classroom CourseWork API.",
      "workType": "ASSIGNMENT",
      "state": "DRAFT",  # Set to 'PUBLISHED' to assign to students.
  }

  # Issue a request to create the assignment.
  create_assignment_response = (
      classroom_service.courses()
      .courseWork()
      .create(courseId=course_id, body=coursework)
      .execute()
  )

  # Create an add-on attachment that links to the selected content and
  # associate it with the new assignment.
  content_url = flask.url_for(
      "example_coursework_assignment",
      assignment_type="add-on-attachment",
      _scheme="https",
      _external=True,
  )

  # Construct an AddOnAttachment instance.
  attachment = {
      "teacherViewUri": {"uri": content_url},
      "studentViewUri": {"uri": content_url},
      "title": f'Test Attachment for Assignment {create_assignment_response.get("id")}',
  }

  # Issue a request to create the attachment.
  add_on_attachment_response = (
      classroom_service.courses()
      .courseWork()
      .addOnAttachments()
      .create(
          courseId=course_id,
          itemId=create_assignment_response.get("id"),  # ID of the new assignment.
          body=attachment,
      )
      .execute()
  )

Если пользователь не имеет права создавать дополнительные вложения, вместо этого создайте связанный материал, выполнив следующие действия:

Python

# The ID of the course to which the assignment will be added.
course_id = 1234567890  # TODO(developer) Replace with an actual course ID.

if not is_create_attachment_eligible:
    coursework = {
        "title": "My CourseWork Assignment with Link Material",
        "description": "Created using the Classroom CourseWork API.",
        "workType": "ASSIGNMENT",
        "state": "DRAFT",  # Set to 'PUBLISHED' to assign to students.
        # Specify the URL for your content as a Link Material.
        "materials": [
            {
                "link": {
                    "url": flask.url_for(
                        "example_coursework_assignment",
                        assignment_type="link-material",
                        _scheme="https",
                        _external=True,
                    )
                }
            }
        ],
    }

    # Issue a request to create the assignment.
    assignment_response = (
        classroom_service.courses()
        .courseWork()
        .create(courseId=course_id, body=coursework)
        .execute()
    )

Изменить уже созданное задание

Вы можете получить доступ, изменить, отправить, запросить или вернуть любой элемент ленты Google Classroom, к которому прикреплен хотя бы один из ваших дополнительных модулей, независимо от того, кто создал этот элемент ленты. Элементами ленты являются любые Announcement , задания CourseWork или CourseWorkMaterial .

Для демонстрации этого вам нужно добавить маршрут для изменения заданного элемента потока. Используйте этот метод, чтобы убедиться, что вы можете получить доступ к элементам потока, созданным вами с помощью API , и к элементам, созданным учителем через пользовательский интерфейс Google Classroom, и изменять их.

Добавьте еще одну ссылку или кнопку на веб-страницу, которую вы редактировали в начале этого пошагового руководства. Она должна открывать новый маршрут для изменения задания CourseWork .

Python

Приведенный пример на Python изменяет маршрут /index , который был изменен ранее в этом пошаговом руководстве .

<!-- /webapp/templates/index.html -->
<a href="modify-coursework-assignment.html">Create a CourseWork Assignment</a>

Создайте новый маршрут для обработки маршрутов, связанных с курсовыми работами. В приведенном нами примере это делается в файле coursework_routes.py .

# Check that the user is signed in.
credentials = get_credentials()

if not credentials:
  return start_auth_flow("coursework_assignment_callback")

# Get the Google Classroom service.
classroom_service = get_classroom_service()

# The ID of the course to which the assignment will be added.
# Ordinarily, you'll prompt the user to specify which course to use. For
# simplicity, we use a hard-coded value in this example.
course_id = 1234567890  # TODO(developer) Replace with an actual course ID.
assignment_id = 1234567890  # TODO(developer) Replace with an actual assignment ID.

# Retrieve details about the CourseWork assignment.
get_coursework_response = (
    classroom_service.courses()
    .courseWork()
    .get(courseId=course_id, id=assignment_id)
    .execute()
)

# Alter the current title.
assignment_title = f"{get_coursework_response.get('title')} (Modified by API request)"

# Issue a request to modify the assignment.
modify_coursework_response = (
    classroom_service.courses()
    .courseWork()
    .patch(
        courseId=course_id,
        id=assignment_id,
        updateMask="title",
        body={"title": assignment_title},
    )
    .execute()
)

Протестируйте дополнение

Для упрощения в приведенных примерах используются жестко заданные идентификаторы курсов и заданий. Вы можете получить эти идентификаторы, отправляя запросы с учетными данными преподавателя к методам get и list ресурсов courses и courseWork . Они также возвращаются в ответе при создании заданий courseWork .

Запустите сервер, затем перейдите на главную страницу и войдите в систему как преподаватель без лицензии Google Workspace for Education Teaching & Learning или Plus . Вы можете изменить статус лицензии пользователя в консоли администратора вашего тестового домена. Нажмите кнопку «Создать задание по курсу» , затем откройте пользовательский интерфейс Google Classroom и убедитесь, что было создано задание со ссылкой на материал. Вложение должно отображать заголовок веб-страницы и URL-адрес.

Тестирование создания дополнительных модулей

Вернитесь на главную страницу и войдите в систему как преподаватель с лицензией Google Workspace for Education Teaching & Learning или Plus . Нажмите кнопку «Создать задание по курсу» , затем откройте пользовательский интерфейс Google Classroom и убедитесь, что задание с прикрепленным дополнительным модулем было создано. В прикрепленном модуле должно отображаться название вашего дополнительного приложения и заголовок, указанный в вашем коде.

изменение задания на тестирование

Вернитесь на главную страницу и убедитесь, что вы вошли в систему как преподаватель с лицензией Teaching & Learning или Plus. Нажмите кнопку «Изменить задание по курсу» , затем вернитесь в интерфейс Google Classroom и убедитесь, что название задания изменено.

Поздравляем! Вы завершили серию пошаговых инструкций.