To siódmy przewodnik z serii przewodników po dodatkach do Classroom.
W tym przewodniku dodasz do aplikacji internetowej funkcję tworzenia załączników dodatków spoza Google Classroom. Dzięki temu użytkownicy będą mogli tworzyć załączniki dodatków na podstawie istniejącego produktu lub witryny. Jest to też świetne uzupełnienie CourseWork
, ponieważ kierujesz dotychczasowy ruch do ulepszonej wersji aplikacji, nie zmieniając sposobu korzystania z niej przez użytkowników. Sugerowany proces znajdziesz na stronie przewodnika Tworzenie załączników poza Classroom.
Możesz też dodać do dodatku funkcję, która programowo modyfikuje projekt za pomocą załączników. Możesz modyfikować dowolny projekt, do którego dołączono załącznik z Twojego dodatku, niezależnie od tego, kto go utworzył. Jest to szczególnie przydatne do oddawania prac po wykonaniu przez ucznia zadania, co sygnalizuje nauczycielowi, że przypisane zadania zostały wykonane, a praca ucznia jest gotowa do sprawdzenia.
Rozszerzasz ostateczną wersję dodatku, która obsługuje załączniki typu content-type lub activity-type. W tym przewodniku używamy załącznika content-type.
Dodawanie zakresu protokołu OAuth do zarządzania projektami
Upewnij się, że aplikacja żąda tych zakresów:
https://www.googleapis.com/auth/classroom.addons.teacher
https://www.googleapis.com/auth/classroom.addons.student
https://www.googleapis.com/auth/classroom.coursework.students
Zakres classroom.coursework.students
nie był wcześniej potrzebny i jest używany do tworzenia lub modyfikowania przypisań CourseWork
. Dodaj ten zakres do list zakresów w pakiecie SDK Google Workspace Marketplace, ekranie zgody OAuth i kodzie serwera w projekcie w chmurze.
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",
]
Tworzenie projektu w Classroom
Dodawanie przycisków do strony internetowej bez ramki iframe
Opisany w tym przewodniku proces umożliwia użytkownikowi tworzenie projektów i załączników w Google Classroom z poziomu produktu innego niż Google. W praktyce będzie to prawdopodobnie Twoja obecna witryna lub aplikacja. W tym przykładzie musisz utworzyć przykładową stronę internetową, która będzie pełnić funkcję witryny zewnętrznej. Potrzebujesz przycisku lub linku, który po kliknięciu otwiera nową ścieżkę wykonującą sugerowany
CourseWork
proces tworzenia nowego zadania.
Musisz też dodać przycisk lub link, który umożliwi użytkownikowi zalogowanie się, jeśli jeszcze go nie masz. Do wykonania kolejnych żądań do interfejsu API potrzebne są dane logowania użytkownika, dlatego musi on przeprowadzić proces uzgadniania OAuth 2.0. Szczegółowe wskazówki znajdziesz w przewodniku po logowaniu.
Python
Podany przykład w języku Python modyfikuje /index
, który został wprowadzony w pierwszym kroku przewodnika.
<!-- /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>
Dodaj szablon HTML reprezentujący miejsce docelowe w Twojej witrynie. Ta strona będzie zawierać treści, które zostaną dołączone do projektuCourseWork
.
<!-- /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>
Utwórz nowy plik modułu Pythona do obsługi tras związanych z zadaniami.
W naszym przykładzie jest to coursework_routes.py
. Dodaj te 3 trasy. Niektóre treści uzupełnisz później.
# /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")
Sprawdzanie, czy użytkownik może tworzyć załączniki
Zanim w imieniu użytkownika utworzysz załączniki dodatkowe, musi on spełnić kilka wymagań wstępnych. Aby ułatwić Ci to zadanie, Google udostępnia metodę userProfiles.checkUserCapability
, która pozwala sprawdzić, czy użytkownik spełnia te wymagania wstępne. Użytkownik, który spełnia warunki wstępne, jest określany jako kwalifikujący się.
Dodaj sprawdzanie kryteriów kwalifikacji do implementacji ścieżki tworzenia CourseWork
.
Następnie przetestuj pole allowed
w odpowiedzi. W przypadku kwalifikujących się użytkowników postępuj zgodnie z logiką, aby utworzyć projekt z załącznikiem dodatku. W przeciwnym razie utwórz materiał z linkiem. Musisz znać identyfikator kursu, w którym użytkownik chce utworzyć projekt. Zwykle prosisz użytkownika o określenie, którego kursu ma użyć. W tym przykładzie dla uproszczenia używamy zakodowanej na stałe wartości.
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.
Tworzenie projektu z załącznikiem dodatku dla uprawnionych użytkowników
Jeśli użytkownik może tworzyć załączniki dodatków, wykonaj te czynności:
- Wyślij żądanie do interfejsu API, aby utworzyć zadanie
courseWork
w Google Classroom bez załączników. - Wyodrębnij
id
nowo utworzonego projektu. - Utwórz nowy obiekt CourseWork
AddOnAttachment
. - Wysyłanie prośby o utworzenie załącznika dodatku w nowo utworzonym projekcie w 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()
)
Tworzenie materiału linku
Jeśli użytkownik nie kwalifikuje się do tworzenia dodatkowych załączników, utwórz zamiast tego Link Material, wykonując te czynności:
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()
)
Modyfikowanie utworzonego już projektu
Możesz uzyskać dostęp do dowolnego elementu strumienia Google Classroom, który zawiera co najmniej 1 załącznik dodatku, modyfikować go, przesyłać, odzyskiwać lub zwracać, niezależnie od tego, kto go utworzył. Elementy strumienia to dowolne Announcement
, CourseWork
lub CourseWorkMaterial
.
Aby to zademonstrować, dodasz trasę, która zmodyfikuje dany element strumienia. Użyj tej metody, aby sprawdzić, czy możesz uzyskiwać dostęp do elementów strumienia utworzonych przez Ciebie i modyfikować je za pomocą interfejsu API oraz czy możesz uzyskiwać dostęp do elementów utworzonych przez nauczyciela w interfejsie Google Classroom.
Dodaj jeszcze jeden link lub przycisk do strony internetowej, którą po raz pierwszy edytowano w tym przewodniku. Powinna otworzyć się nowa ścieżka umożliwiająca modyfikowanie CourseWork
przypisania.
Python
Podany przykład w języku Python modyfikuje /index
, która została zmodyfikowana wcześniej w tym przewodniku.
<!-- /webapp/templates/index.html -->
<a href="modify-coursework-assignment.html">Create a CourseWork Assignment</a>
Utwórz nową ścieżkę do obsługi ścieżek związanych z CourseWork. W podanym przez nas przykładzie jest to plik 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()
)
Testowanie dodatku
Dla uproszczenia w podanych przykładach użyto identyfikatorów kursów i zadań zakodowanych na stałe. Te identyfikatory możesz uzyskać, wysyłając żądania z danymi logowania nauczyciela do metod get
i list
zasobów courses
i courseWork
. Są one też zwracane w odpowiedzi podczas tworzenia courseWork
zadań.
Tworzenie materiału do testowania linków
Uruchom serwer, a następnie otwórz stronę indeksu i zaloguj się jako nauczyciel bez licencji Google Workspace for Education Teaching & Learning lub Plus. Możesz przełączać stan licencji użytkownika w konsoli administracyjnej domeny testowej.Kliknij przycisk Utwórz zadanie w CourseWork, a następnie otwórz interfejs Google Classroom i sprawdź, czy utworzono zadanie z załącznikiem Link Material. Załącznik powinien zawierać tytuł połączonej strony internetowej i adres URL.
Testowanie tworzenia załącznika dodatku
Wróć na stronę indeksu i zaloguj się jako nauczyciel z licencją Google Workspace for Education Teaching and Learning lub Plus. Kliknij przycisk Utwórz projekt, a następnie otwórz interfejs Google Classroom i sprawdź, czy utworzono projekt z załącznikiem dodatku. Załącznik powinien zawierać nazwę aplikacji dodatku i tytuł określony w kodzie.
Modyfikacja przypisania testu
Wróć na stronę indeksu i upewnij się, że jesteś zalogowany(-a) jako nauczyciel z licencją Teaching & Learning lub Plus. Kliknij przycisk Modify a CourseWork Assignment (Zmodyfikuj projekt), a następnie wróć do interfejsu Google Classroom i sprawdź, czy tytuł projektu został zmieniony.
Gratulacje! Ukończono serię przewodników.