Załączniki typu aktywności

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 jest widoczna 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 odpowiedzi getAddOnContext 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.