To jest piąty przewodnik po dodatkach do Classroom. które zrecenzować w naszym serwisie.
W tym przewodniku zmodyfikujesz przykład z poprzedniego kroku przewodnika w celu utworzenia załącznika typu działania. Są to załączniki, wymaganie przesłania przez ucznia, np. pisemnej odpowiedzi, testu lub innego artefaktu wygenerowanego przez uczniów.
Rozróżnienie między załącznikami typu treści i aktywności jest istotne. Załączniki związane z aktywnością różnią się od typu treści pod tym względem:
- „Oddanie” w prawym górnym rogu elementu iframe Widok ucznia.
- Zapewniają unikalny identyfikator pracy ucznia.
- Karta załącznika wyświetla się w interfejsie ucznia do oceniania w Classroom.
- Mogą też ustawić ocenę za projekt, do którego należą.
W następnym przewodniku znajdziesz opis sposobu oceniania. W trakcie tego szkolenia wykonaj następujące czynności:
- Zmodyfikuj poprzednie żądania utworzenia załączników do interfejsu API Classroom do tworzenia załącznika typu aktywność.
- Wdróż trwałe przechowywanie prac uczniów.
- Zmodyfikuj poprzednią trasę widoku ucznia, aby akceptować dane wejściowe uczniów.
- Podaj trasę do wyświetlania elementu iframe z recenzją pracy ucznia.
Po ukończeniu projektu możesz utworzyć załączniki z aktywnością w projektach. interfejsu Google Classroom po zalogowaniu się jako nauczyciel. Uczniowie na zajęciach mogą a następnie wykonać działanie w elemencie iframe i przesłać odpowiedź. Nauczyciel może: wyświetlając zadanie przesłane przez ucznia w interfejsie oceniania Classroom.
Na potrzeby tego przykładu użyj ponownie szablonu załącznika z poprzedni przewodnik przedstawiający zdjęcie znanego punktu orientacyjnego i napis nazwę punktu orientacyjnego. W ramach ćwiczenia nakłaniamy ucznia do: należy podać nazwę punktu orientacyjnego.
Modyfikowanie prośby o utworzenie załącznika
Przejdź do sekcji kodu, w której masz utworzony element content-type.
w załączniku w poprzednim przewodniku. Kluczowym elementem jest tu instancja
Obiekt AddOnAttachment, w którym wcześniej określono teacherViewUri
,
studentViewUri
i title
dla załącznika.
Wszystkie załączniki dodatków wymagają stosowania tych trzech pól, obecność lub
brak studentWorkReviewUri
określa, czy załącznik jest
activity-type lub content-type. Żądanie CREATE
z wypełnionym polem
Element studentWorkReviewUri
stanie się załącznikem typu aktywność, a CREATE
żądanie bez studentWorkReviewUri
staje się załącznikiem typu treści.
Jedyną zmianą, jaką należy wprowadzić w tym żądaniu, jest uzupełnienie pola
studentWorkReviewUri
. Dodaj w tym miejscu prawidłową nazwę trasy. Ty
Wykorzystamy go
w późniejszym kroku.
Python
W podanym przykładzie jest to metoda create_attachments
w kluczu
webapp/attachment_routes.py
.
attachment = {
# Specifies the route for a teacher user.
"teacherViewUri": {
"uri":
flask.url_for(
"load_activity_attachment",
_scheme='https',
_external=True),
},
# Specifies the route for a student user.
"studentViewUri": {
"uri":
flask.url_for(
"load_activity_attachment",
_scheme='https',
_external=True)
},
# Specifies the route for a teacher user when the attachment is
# loaded in the Classroom grading view.
# The presence of this field marks this as an activity-type attachment.
"studentWorkReviewUri": {
"uri":
flask.url_for(
"view_submission", _scheme='https', _external=True)
},
# The title of the attachment.
"title": f"Attachment {attachment_count}",
}
Dodaj pamięć trwałą na załączniki typu treści
Zapisz odpowiedź ucznia na naszą aktywność. Możesz to sprawdzić później, gdy nauczyciel wyświetla przesłane zadanie w elemencie iframe z podsumowaniem pracy ucznia.
Skonfiguruj schemat bazy danych dla: Submission
. Nasz przykład wymaga,
wpisz nazwę punktu orientacyjnego przedstawionego na obrazku. Submission
w związku z tym zawiera następujące atrybuty:
attachment_id
: unikalny identyfikator załącznika. Przydzielone przez Classroom i zwracane w odpowiedzi podczas tworzenia załącznik.submission_id
: identyfikator zadania przesłanego przez ucznia. Przydzielone przez Classroom i zwrócone w odpowiedzigetAddOnContext
w: widoku ucznia.
student_response
: odpowiedź podana przez ucznia.
Python
Rozszerz implementację SQLite i flask_sqlalchemy
z poprzednich kroków.
Przejdź do pliku, w którym zostały zdefiniowane poprzednie tabele.
(models.py
, jeśli używasz naszego przykładu). Dodaj następujące elementy na stronie
na dole pliku.
# Database model to represent a student submission.
class Submission(db.Model):
# The attachmentId is the unique identifier for the attachment.
submission_id = db.Column(db.String(120), primary_key=True)
# The unique identifier for the student's submission.
attachment_id = db.Column(db.String(120), primary_key=True)
# The student's response to the question prompt.
student_response = db.Column(db.String(120))
Zaimportuj nową klasę Submission
do pliku na serwerze z załącznikiem
tras obsługi.
Modyfikowanie trasy widoku ucznia
Następnie zmodyfikuj poprzednią trasę w widoku ucznia, aby wyświetlić mały formularz i zaakceptować od ucznia. Możesz ponownie wykorzystać większość kodu z poprzedniej sekcji .
Znajdź kod serwera udostępniający trasę widoku ucznia. To jest
trasę podaną w polu studentViewUri
podczas tworzenia załącznika.
Pierwszą zmianą jest wyodrębnienie submissionId
z
getAddOnContext
odpowiedź.
Python
W podanym przykładzie jest to metoda load_activity_attachment
w argumencie
pliku webapp/attachment_routes.py
.
# Issue a request to the courseWork.getAddOnContext endpoint
addon_context_response = classroom_service.courses().courseWork(
).getAddOnContext(
courseId=flask.session["courseId"],
itemId=flask.session["itemId"]).execute()
# One of studentContext or teacherContext will be populated.
user_context = "student" if addon_context_response.get(
"studentContext") else "teacher"
# If the user is a student...
if user_context == "student":
# Extract the submissionId from the studentContext object.
# This value is provided by Google Classroom.
flask.session["submissionId"] = addon_context_response.get(
"studentContext").get("submissionId")
Możesz też przesłać prośbę o sprawdzenie stanu zadania przesłanego przez ucznia.
Odpowiedź zawiera wartość SubmissionState
, która wskazuje, że taki stan
sprawdź, czy uczeń otworzył załącznik, czy go oddał. Może to być
przydatne, jeśli chcesz zablokować edycję oddanego zadania lub
zainteresowanych przekazaniem nauczycielom informacji na temat postęp:
Python
W podanym przykładzie jest to kontynuacja polecenia
load_activity_attachment
powyżej.
# Issue a request to get the status of the student submission.
submission_response = classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().get(
courseId=flask.session["courseId"],
itemId=flask.session["itemId"],
attachmentId=flask.session["attachmentId"],
submissionId=flask.session["submissionId"]).execute()
Na koniec pobierz informacje o załącznikach z naszej bazy danych i udostępnij dane wejściowe formularza. Formularz w naszym przykładzie składa się z pola do wprowadzania ciągu znaków oraz Prześlij. Pokaż obraz punktu orientacyjnego i poproś ucznia o wpisanie jego imienia i nazwiska. Gdy udzielą odpowiedzi, zapisz ją w naszej bazie danych.
Python
W podanym przykładzie jest to kontynuacja polecenia
load_activity_attachment
powyżej.
# Look up the attachment in the database.
attachment = Attachment.query.get(flask.session["attachmentId"])
message_str = f"I see that you're a {user_context}! "
message_str += (
f"I've loaded the attachment with ID {attachment.attachment_id}. "
if user_context == "teacher" else
"Please complete the activity below.")
form = activity_form_builder()
if form.validate_on_submit():
# Record the student's response in our database.
# Check if the student has already submitted a response.
# If so, update the response stored in the database.
student_submission = Submission.query.get(flask.session["submissionId"])
if student_submission is not None:
student_submission.student_response = form.student_response.data
else:
# Store the student's response by the submission ID.
new_submission = Submission(
submission_id=flask.session["submissionId"],
attachment_id=flask.session["attachmentId"],
student_response=form.student_response.data)
db.session.add(new_submission)
db.session.commit()
return flask.render_template(
"acknowledge-submission.html",
message="Your response has been recorded. You can close the " \
"iframe now.",
instructions="Please Turn In your assignment if you have " \
"completed all tasks."
)
# Show the activity.
return flask.render_template(
"show-activity-attachment.html",
message=message_str,
image_filename=attachment.image_filename,
image_caption=attachment.image_caption,
user_context=user_context,
form=form,
responses=response_strings)
Aby odróżnić użytkowników, spróbuj wyłączyć przesyłanie i wyświetlić prawidłową odpowiedź w widoku nauczyciela.
Dodawanie trasy do elementu iframe z oceną pracy ucznia
Na koniec dodaj trasę, która będzie wyświetlać element iframe z oceną pracy ucznia. Nazwa elementu
trasa powinna być zgodna z trasą podaną dla studentWorkReviewUri
podczas tworzenia
załącznik. Ta trasa otwiera się, gdy nauczyciel wyświetla zadanie przesłane przez ucznia w
interfejsu oceniania w Classroom.
Parametr zapytania submissionId
otrzymujesz, gdy Classroom
otwiera element iframe Przegląd pracy ucznia. Za jego pomocą możesz pobrać zadanie ucznia z
lokalnej bazy danych:
Python
W naszym przykładzie znajduje się to w pliku webapp/attachment_routes.py
.
@app.route("/view-submission")
def view_submission():
"""
Render a student submission using the show-student-submission.html template.
"""
# Save the query parameters passed to the iframe in the session, just as we did
# in previous routes. Abbreviated here for readability.
add_iframe_query_parameters_to_session(flask.request.args)
# For the sake of brevity in this example, we'll skip the conditional logic
# to see if we need to authorize the user as we have done in previous steps.
# We can assume that the user that reaches this route is a teacher that has
# already authorized and created an attachment using the add-on.
# In production, we recommend fully validating the user's authorization at
# this stage as well.
# Look up the student's submission in our database.
student_submission = Submission.query.get(flask.session["submissionId"])
# Look up the attachment in the database.
attachment = Attachment.query.get(student_submission.attachment_id)
# Render the student's response alongside the correct answer.
return flask.render_template(
"show-student-submission.html",
message=f"Loaded submission {student_submission.submission_id} for "\
f"attachment {attachment.attachment_id}.",
student_response=student_submission.student_response,
correct_answer=attachment.image_caption)
Testowanie dodatku
Powtórz Przetestuj kroki dodatku z poprzedniego przewodnika. Zalecenia mają załącznik, który może otworzyć uczeń.
Aby przetestować załącznik, wykonaj te czynności:
- Zaloguj się w Google Classroom. jako jedno z Twoich uczeń testuje użytkowników na tych samych zajęciach co użytkownik testowy nauczyciela.
- Otwórz kartę Zadania i rozwiń test Projekt.
- Kliknij kartę załącznika dodatku, aby otworzyć Widok ucznia i przesłać dla danej aktywności.
- Po zakończeniu aktywności zamknij element iframe. Opcjonalnie kliknij przycisk Włącz Przycisk rozpoczęcia.
Gdy ukończysz ten proces, w Classroom nie powinno się nic zmienić aktywność. Teraz przetestuj element iframe z oceną pracy ucznia:
- Zaloguj się w Classroom jako użytkownik testowy – nauczyciel.
- Na karcie Oceny znajdź kolumnę projektu testowego. Kliknij nazwę projektu testowego.
- Znajdź kartę użytkownika testowego. Kliknij załącznik na karcie.
Sprawdź, czy uczeń wyświetla poprawne zadanie.
Gratulacje! Możesz już przejść do następnego kroku: synchronizowanie załączników. oceny.