Это седьмое пошаговое руководство из серии пошаговых руководств по дополнениям Classroom.
В этом пошаговом руководстве вы добавите поведение в веб-приложение для создания дополнительных вложений вне Google Classroom . Используйте это поведение, чтобы позволить пользователям создавать дополнительные вложения из вашего существующего продукта или веб-сайта. Это также отличное дополнение к интеграции CourseWork
поскольку вы направляете существующий трафик на улучшенный пользовательский интерфейс, предлагаемый вашим дополнением, не изменяя его поток. Рекомендуемый процесс описан на странице руководства « Создание вложений вне Google 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
. Добавьте эту область действия в списки областей действия в Google Workspace Marketplace SDK вашего облачного проекта, на экран согласия OAuth и в код сервера.
Питон
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",
]
Создать задание в классе
Добавить кнопки на веб-страницу без iframe
Описанный в этом пошаговом руководстве процесс позволяет пользователю создавать задания и вложения Google Classroom из стороннего продукта. На практике это, скорее всего, ваш существующий веб-сайт или приложение. В данном примере вам необходимо создать макет веб-страницы, которая будет выполнять функции внешнего сайта. Вам нужна кнопка или ссылка, при нажатии на которую откроется новый маршрут , реализующий предлагаемый процесс CourseWork
для создания нового задания.
Вам также потребуется добавить кнопку или ссылку, позволяющую пользователю войти в систему, если у вас её ещё нет. Для последующих запросов к API вам понадобятся учётные данные пользователя, поэтому необходимо будет пройти процедуру подтверждения OAuth 2.0. Подробные инструкции см. в пошаговом руководстве по входу в систему.
Питон
Приведенный пример 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 предоставляет метод userProfiles.checkUserCapability
, который определяет, соответствует ли пользователь этим требованиям. Пользователь, соответствующий этим требованиям, называется допустимым пользователем.
Добавьте проверку соответствия требованиям к реализации маршрута создания CourseWork
. Затем проверьте allowed
поле в ответе. Для пользователей, имеющих право на участие, следуйте логике создания задания с прикрепленным дополнением . В противном случае создайте ссылку на материал (Link Material) . Вам потребуется знать идентификатор курса, в рамках которого пользователь хочет создать задание. Обычно пользователю предлагается указать, какой курс использовать. Для простоты в этом примере мы используем жёстко заданное значение.
Питон
# /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.
Создайте задание с дополнительным приложением для соответствующих пользователей.
Если пользователь имеет право создавать дополнительные вложения, выполните следующие действия:
- Отправьте API-запрос на создание задания
courseWork
в Google Classroom без вложений . - Извлеките
id
вновь созданного задания. - Создайте новый CourseWork
AddOnAttachment
. - Отправьте запрос на создание дополнительного вложения к недавно созданному заданию в Google Classroom.
Питон
# 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()
)
Создать ссылочный материал
Если пользователь не имеет права создавать дополнительные вложения, создайте вместо этого материал-ссылку, выполнив следующие действия:
Питон
# 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 Класса.
Добавьте ещё одну ссылку или кнопку на веб-страницу, которую вы впервые отредактировали в этом пошаговом руководстве. Это должно открыть новый путь для редактирования задания CourseWork
.
Питон
Приведенный пример 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()
)
Протестируйте дополнение
Для простоты в представленных примерах используются жёстко заданные идентификаторы курсов и заданий. Вы можете получить эти идентификаторы, отправив запросы с учётными данными преподавателя к методам get
и list
courses
и ресурсов courseWork
. Они также возвращаются в ответе при создании заданий courseWork
.
Создание тестового материала по ссылке
Запустите сервер, затем перейдите на главную страницу и войдите как преподаватель без лицензии Google Workspace for Education Teaching & Learning или Plus . Вы можете изменить статус лицензии пользователя в консоли администратора вашего тестового домена. Нажмите кнопку «Создать задание по курсовой работе» , затем откройте интерфейс Google Classroom и убедитесь, что задание с прикрепленным материалом Link Material создано. В прикрепленном файле должны быть указаны название веб-страницы и URL-адрес.
Создание тестового дополнения к приложению
Вернитесь на главную страницу и войдите как преподаватель с лицензией Google Workspace for Education Teaching & Learning или Plus . Нажмите кнопку «Создать задание по курсовой работе» , затем откройте интерфейс Google Classroom и убедитесь, что задание с прикрепленным дополнением создано. Вложение должно содержать название вашего приложения-дополнения и заголовок, указанный в коде.
Модификация тестового задания
Вернитесь на главную страницу и убедитесь, что вы вошли в систему как преподаватель с лицензией Teaching & Learning или Plus. Нажмите кнопку «Изменить задание CourseWork» , затем вернитесь в интерфейс Google Classroom и убедитесь, что название задания изменилось.
Поздравляем! Вы завершили серию пошаговых инструкций.