Dies ist die siebte Schritt-für-Schritt-Anleitung in der Reihe zu Classroom-Add-ons.
In dieser Anleitung fügen Sie einer Webanwendung ein Verhalten hinzu, um Add-on-Anhänge von außerhalb von Google Classroom zu erstellen. Mit diesem Verhalten können Nutzer Add-on-Anhänge über Ihr bestehendes Produkt oder Ihre Website erstellen. Das ist auch eine gute Ergänzung zu einer CourseWork
-Integration, da Sie den bestehenden Traffic auf die verbesserte Nutzerfreundlichkeit Ihres Add-ons lenken, ohne den Ablauf zu ändern. Eine Anleitung dazu finden Sie auf der Seite Anhänge außerhalb von Classroom erstellen.
Außerdem können Sie Ihrem Add-on ein Verhalten hinzufügen, um eine Aufgabe mit Add-on-Anhängen programmatisch zu ändern. Sie können jede Aufgabe ändern, die einen Ihrer Add-on-Anhänge enthält, unabhängig davon, wer die Aufgabe erstellt hat. Das ist besonders nützlich, um Aufgaben abzugeben, nachdem ein Schüler/Student eine Aktivität abgeschlossen hat. So wird dem Lehrer signalisiert, dass die zugewiesenen Aufgaben erledigt sind und die Arbeit des Schülers/Studenten zur Überprüfung bereit ist.
Sie erweitern die finale Version Ihres Add-ons, sodass es Anhänge vom Inhaltstyp oder Aktivitätstyp unterstützt. In diesem Leitfaden wird der Inhaltstyp „Anhang“ verwendet.
OAuth-Bereich für die Aufgabenverwaltung hinzufügen
Ihre Anwendung muss die folgenden Zugriffsbereiche anfordern:
https://www.googleapis.com/auth/classroom.addons.teacher
https://www.googleapis.com/auth/classroom.addons.student
https://www.googleapis.com/auth/classroom.coursework.students
Der classroom.coursework.students
-Zugriffsbereich war bisher nicht erforderlich und wird zum Erstellen oder Ändern von CourseWork
-Aufgaben verwendet. Fügen Sie diesen Umfang den Listen der Bereiche im Google Workspace Marketplace SDK, im OAuth-Einwilligungsdialogfeld und im Servercode Ihres Cloud-Projekts hinzu.
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",
]
Aufgaben in Classroom erstellen
Schaltflächen auf einer Webseite ohne Iframe hinzufügen
Mit dem in dieser Anleitung beschriebenen Ablauf können Nutzer Google Classroom-Aufgaben und -Anhänge über ein Produkt erstellen, das nicht von Google stammt. In der Praxis ist dies wahrscheinlich Ihre vorhandene Website oder Anwendung. Für dieses Beispiel müssen Sie eine Mock-Webseite erstellen, die als externe Website dient. Sie benötigen eine Schaltfläche oder einen Link, über den eine neue Route geöffnet wird, über die der vorgeschlagene CourseWork
-Vorgang ausgeführt wird, um eine neue Aufgabe zu erstellen.
Außerdem müssen Sie eine Schaltfläche oder einen Link hinzufügen, über den sich der Nutzer anmelden kann, falls Sie noch keine haben. Für die nachfolgenden API-Anfragen sind Nutzeranmeldedaten erforderlich. Daher muss der OAuth 2.0-Handshake abgeschlossen werden. Eine genaue Anleitung findest du in der Anleitung zum Anmelden.
Python
Im bereitgestellten Python-Beispiel wird die /index
-Route geändert, die im ersten Schritt der Schritt-für-Schritt-Anleitung vorgestellt wurde.
<!-- /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>
Fügen Sie eine HTML-Vorlage hinzu, um ein Ziel auf Ihrer Website darzustellen. Auf dieser Seite werden die Inhalte angezeigt, die an Ihre CourseWork
-Aufgabe angehängt werden.
<!-- /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>
Erstellen Sie eine neue Python-Moduldatei, um die zu Kursen gehörenden Routen zu verarbeiten.
In unserem Beispiel ist das coursework_routes.py
. Fügen Sie die folgenden drei Routen hinzu. Einige Inhalte füllen Sie später aus.
# /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")
Prüfen, ob ein Nutzer Anhänge erstellen darf
Es gibt mehrere Voraussetzungen, die ein Nutzer erfüllen muss, damit Sie Add-on-Anhänge in seinem Namen erstellen können. Google stellt die Methode userProfiles.checkUserCapability
zur Verfügung, um zu ermitteln, ob ein Nutzer diese Voraussetzungen erfüllt. Ein Nutzer, der die Voraussetzungen erfüllt, wird als berechtigter Nutzer bezeichnet.
Fügen Sie der Implementierung des CourseWork
-Erstellungs-Routings die Berechtigungsprüfung hinzu.
Testen Sie dann das Feld allowed
in der Antwort. Für berechtigte Nutzer: Folgen Sie der Logik, um eine Aufgabe mit Add-on-Anhang zu erstellen. Andernfalls erstellen Sie ein Linkmaterial. Sie benötigen die ID des Kurses, in dem der Nutzer eine Aufgabe erstellen möchte. Normalerweise werden Sie den Nutzer auffordern, anzugeben, welchen Kurs er verwenden möchte. Zur Vereinfachung verwenden wir in diesem Beispiel einen hartcodierten Wert.
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.
Aufgaben mit Add-on-Anhängen für berechtigte Nutzer erstellen
Wenn der Nutzer Add-on-Anhänge erstellen darf, gehen Sie so vor:
- Senden Sie eine API-Anfrage, um eine
courseWork
-Aufgabe in Google Classroom ohne Anhänge zu erstellen. - Extrahieren Sie die
id
der neu erstellten Aufgabe. - Erstellen Sie eine neue Kursarbeit
AddOnAttachment
. - Senden Sie eine Anfrage, um einen Add-on-Anhang für die neu erstellte Aufgabe in Google Classroom zu erstellen.
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()
)
Linkmaterial erstellen
Wenn der Nutzer nicht berechtigt ist, Add-on-Anhänge zu erstellen, erstellen Sie stattdessen ein verlinktes Material. Gehen Sie dazu so vor:
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()
)
Bereits erstellte Aufgaben ändern
Sie können auf alle Google Classroom-Streamelemente zugreifen, die mindestens einen Ihrer Add-on-Anhänge enthalten, unabhängig davon, wer das Streamelement erstellt hat. Sie können sie auch ändern, abgeben, zurückfordern oder zurückgeben. Zu den Streamelementen gehören alle Announcement
, CourseWork
-Aufgaben und CourseWorkMaterial
.
Zur Veranschaulichung fügen Sie eine Route hinzu, um ein bestimmtes Streamelement zu ändern. Mit dieser Methode können Sie prüfen, ob Sie auf Streamelemente zugreifen und diese ändern können, die Sie mit der API und von einem Lehrer über die Google Classroom-Benutzeroberfläche erstellt haben.
Fügen Sie der Website, die Sie in dieser Anleitung zuerst bearbeitet haben, einen weiteren Link oder eine weitere Schaltfläche hinzu. Es sollte eine neue Route geöffnet werden, um eine CourseWork
-Aufgabe zu ändern.
Python
Im bereitgestellten Python-Beispiel wird die Route /index
geändert, die früher in dieser Anleitung geändert wurde.
<!-- /webapp/templates/index.html -->
<a href="modify-coursework-assignment.html">Create a CourseWork Assignment</a>
Erstellen Sie eine neue Route, um die zu Kursarbeiten gehörenden Routen zu verarbeiten. Dieser befindet sich in der Datei coursework_routes.py
in unserem Beispiel.
# 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()
)
Add-on testen
Der Einfachheit halber werden in den Beispielen hartcodierte Kurs- und Aufgaben-IDs verwendet. Sie können diese IDs abrufen, indem Sie mit den Anmeldedaten eines Lehrers Anfragen an die get
- und list
-Methoden der Ressourcen courses
und courseWork
senden. Sie werden auch in der Antwort zurückgegeben, wenn Sie courseWork
-Aufgaben erstellen.
Test Link Material creation
Starten Sie Ihren Server, rufen Sie Ihre Indexseite auf und melden Sie sich als Lehrkraft ohne Google Workspace for Education Teaching and Learning- oder Plus-Lizenz an. Sie können den Lizenzstatus eines Nutzers in der Admin-Konsole Ihrer Testdomain aktivieren oder deaktivieren.Klicken Sie auf die Schaltfläche Aufgabe für Kursarbeit erstellen, öffnen Sie die Google Classroom-Benutzeroberfläche und prüfen Sie, ob eine Aufgabe mit einem angehängten Link zu Material erstellt wurde. Der Anhang sollte den Titel der verlinkten Webseite und eine URL enthalten.
Erstellung von Add-on-Anhängen testen
Kehren Sie zur Indexseite zurück und melden Sie sich als Lehrkraft mit einer Google Workspace for Education Teaching and Learning- oder Plus-Lizenz an. Klicken Sie auf die Schaltfläche Kursarbeit – Aufgabe erstellen, öffnen Sie die Google Classroom-Benutzeroberfläche und prüfen Sie, ob eine Aufgabe mit einem Add-on-Anhang erstellt wurde. Der Anhang sollte den Namen Ihrer Add-on-Anwendung und den in Ihrem Code angegebenen Titel enthalten.
Testaufgabe ändern
Kehren Sie zur Indexseite zurück und prüfen Sie, ob Sie als Lehrkraft mit einer Teaching and Learning- oder Plus-Lizenz angemeldet sind. Klicken Sie auf die Schaltfläche Coursework-Aufgabe ändern und kehren Sie dann zur Google Classroom-Benutzeroberfläche zurück. Prüfen Sie, ob der Titel der Aufgabe geändert wurde.
Glückwunsch! Sie haben die Schritt-für-Schritt-Anleitungen abgeschlossen.