外部附件和上交

这是关于 Google 课堂插件的第七个演示 演示系列视频

在本演示中,您将向 Web 应用添加行为以创建插件 Google 课堂外部的附件”。使用此行为可让您的 用户通过您现有的产品或网站创建插件附件。这是 也是对 CourseWork 集成的绝佳补充,因为您可以将现有的 提升用户体验的优质流量,且无需更改 流程如需了解建议的流程,请参阅创建附件 非 Google 课堂指南页面。

您还可以向插件添加行为,以使用插件修改分配 以编程方式删除附件。您可以修改任何包含 插件附件,无论作业的创建者是谁。这是 在学生完成一项作业后上交作业时 尤其有用 告知教师已布置的任务已完成, 学生的作业已准备好接受审阅。

您可以扩展支持 content-type活动类型的附件。本指南使用的是内容类型附件。

添加分配管理 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 分配。将此范围添加到列表中 范围限制 Google Workspace Marketplace SDKOAuth 同意屏幕以及您的 服务器代码。

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",
  ]

在 Google 课堂中创建作业

向非 iframe 网页添加按钮

本演示中描述的流程允许用户 来自非 Google 产品的 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 相关的路线。 这是我们提供的示例中的 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 提供了 courses.checkAddOnCreationEligibility 方法,用于确定用户是否 满足这些前提条件满足前提条件的用户称为 符合条件的用户。

将资格检查添加到 CourseWork 创建路线实现中。 然后,测试响应中的 isCreateAttachmentEligible 字段。对于符合条件的 请按照相应逻辑创建带有附加项的作业 附件。否则,请创建一个链接 材质。您需要知道 用户想要创建分配关系的位置。通常,您需要提示用户 指定要使用的课程为简单起见,我们在 这个示例。

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

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

  # Check whether the user can create add-on attachments.
  eligibility_response = (
      classroom_service.courses()
      .checkAddOnCreationEligibility(courseId=course_id)
      .execute()
  )
  is_create_attachment_eligible = eligibility_response.get("isCreateAttachmentEligible")

  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 课堂。
  2. 提取新创建的作业的 id
  3. 构造一个新的 CourseWork AddOnAttachment
  4. 发送请求,为新创建的新项目创建插件附件 Google 课堂中的作业。

Python

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

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 课堂 包含至少一个插件附件的流项目,无论其 创建了流项。信息流内容可以是任何 AnnouncementCourseWork 作业或 CourseWorkMaterial

为了演示这一点,您需要添加一个路由来修改给定流项。使用此 方法,用于验证您是否可以访问和修改您创建的信息流内容 使用相应 API 创建,由教师通过 Google 课堂界面创建。

向您首次编辑的网页再添加一个链接或按钮 。它应该会打开一条新路由来修改 CourseWork 分配。

Python

提供的 Python 示例对修改后的 /index 路由进行了修改 请参阅本演示前面部分

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

创建新路由来处理与 CourseWork 相关的路由。在 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()
)

测试插件

为简单起见,提供的示例使用硬编码课程和 分配标识符。要获取这些标识符,您可以使用 coursesgetlist 方法的 Teachers 凭据和 courseWork 资源。在创建实体时,响应中也会返回 courseWork 项作业。

运行服务器,然后转到索引页面,并以教师用户身份登录 未采用 Google Workspace 教育版的教学和Learning 或 Plus 许可。您可以切换 用户的许可状态 管理控制台。点击 Create a CourseWork Assignment(创建 CourseWork 作业) 按钮,然后打开 Google 课堂界面并验证带有 已创建链接 Material 附件。附件应显示 链接的网页和网址。

测试插件附件创建

返回索引页面,然后以教师用户身份登录 Google Workspace 教育版教学页面 &amp;Learning 或 Plus 许可。点击 Create a CourseWork Assignment(创建 CourseWork 作业) 按钮,然后打开 Google 课堂界面并验证含有 创建了一个插件附件。附件应该显示您的 插件应用和代码中指定的标题。

测试分配修改

返回索引页面,确保您已以教师用户身份登录 以及Learning 或 Plus 许可。点击 Edit a CourseWork(修改课程作业) 作业按钮,然后返回 Google 课堂界面并验证 作业标题已更改。

恭喜!您已完成本演示系列教程。