Załączniki zewnętrzne i oddanie

To jest siódmy przewodnik z serii przewodników dotyczących dodatków do Classroom.

Z tego przewodnika dowiesz się, jak dodać do aplikacji internetowej zachowanie umożliwiające tworzenie dodatków spoza Google Classroom. Użyj tego sposobu, aby umożliwić użytkownikom tworzenie załączników dodatków z istniejącej usługi lub witryny. To także świetne uzupełnienie integracji CourseWork, ponieważ kierujesz istniejący ruch na ulepszoną wygodę użytkowników, jaką zapewnia Twój dodatek, bez zmiany procesu. Sugerowany proces został omówiony na stronie przewodnika Tworzenie załączników poza Classroom.

Możesz też dodać działanie do dodatku, aby automatycznie modyfikować projekt z załącznikami. Możesz modyfikować każdy projekt, który ma załącznik z Twoim dodatkiem, niezależnie od tego, kto go utworzył. Jest to szczególnie przydatne w przypadku oddawania projektów po ukończeniu zadania przez ucznia, dzięki czemu nauczyciel może zasygnalizować nauczycielowi, że zadania zostały ukończone, a praca jest gotowa do sprawdzenia.

Rozszerzysz ostateczną wersję dodatku, która obsługuje załączniki typu content-type lub activity-type. W tym przewodniku używamy załącznika typu treści.

Dodaj zakres protokołu OAuth do zarządzania projektami

Upewnij się, że Twoja 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 służy 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 Cloud.

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 niezawierającej elementów iframe

Proces opisany w tym przewodniku pozwala użytkownikowi tworzyć projekty i załączniki w Google Classroom w usłudze firmy innej niż Google. W praktyce jest to prawdopodobnie Twoja witryna lub aplikacja. W tym przykładzie trzeba utworzyć przykładową stronę internetową, która będzie działać jako witryna zewnętrzna. Potrzebujesz przycisku lub linku, który po kliknięciu otwiera nową trasę wykonującą sugerowany przepływ CourseWork w celu utworzenia nowego projektu.

Musisz też dodać przycisk lub link umożliwiający użytkownikowi zalogowanie się, jeśli jeszcze go nie masz. W kolejnych żądaniach interfejsu API będą potrzebne dane logowania użytkownika, dlatego muszą zakończyć uzgadnianie połączenia OAuth 2.0. Szczegółowe wskazówki znajdziesz w instrukcjach logowania się.

Python

Podany przykład Pythona modyfikuje trasę /index wprowadzoną 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 witrynie. Ta strona zawiera treści, które zostaną dołączone do Twojego projektu 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>

Utwórz nowy plik modułu Pythona do obsługi tras związanych z CourseWork. Jest to coursework_routes.py w podanym przykładzie. Dodaj poniższe 3 trasy (pamiętaj, że część ich treści wypeł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ć dodatki

Aby można było tworzyć załączniki dodatków w imieniu użytkownika, musi on spełnić kilka wymagań wstępnych. Dla wygody Google udostępnia metodę courses.checkAddOnCreationEligibility, która służy do określania, czy użytkownik spełnia te wymagania wstępne. Użytkownik, który spełnia wymagania wstępne, jest nazywany użytkownikiem uprawnionym.

Dodaj kontrolę kwalifikowania się do implementacji trasy tworzenia CourseWork. Następnie przetestuj pole isCreateAttachmentEligible w odpowiedzi. W przypadku kwalifikujących się użytkowników utwórz przypisanie z załącznikiem zgodnie z tą logiką. W przeciwnym razie utwórz materiał linku. Musisz znać identyfikator zajęć, na których użytkownik chce utworzyć projekt. Zazwyczaj użytkownik otrzymuje prośbę o wybranie kursu, z którego chce skorzystać. Dla uproszczenia w tym przykładzie użyjemy wartości zakodowanej na stałe.

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 ...

  # The ID of the course to which the assignment will be added.
  course_id = 1234567890  # TODO(developer) Replace with an actual course ID.

  # Check whether the user can create add-on attachments.
  eligibility_response = (
      classroom_service.courses()
      .checkAddOnCreationEligibility(courseId=course_id)
      .execute()
  )
  is_create_attachment_eligible = eligibility_response.get("isCreateAttachmentEligible")

  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 dla kwalifikujących się użytkowników

Jeśli użytkownik może tworzyć załączniki dodatków, wykonaj te czynności:

  1. Wyślij żądanie do interfejsu API, aby utworzyć courseWork projekt w Google Classroom bez załącznikówbez załączników.
  2. Wyodrębnij id nowo utworzonego projektu.
  3. Utwórz nowy obiekt CourseWork AddOnAttachment.
  4. Wyślij prośbę o utworzenie załącznika dodatku do nowo utworzonego projektu w Google Classroom.

Python

# /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()
  )

Jeśli użytkownik nie ma uprawnień do tworzenia załączników dodatków, utwórz Materiał linku, wykonując te czynności:

Python

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 istniejącego projektu

Możesz uzyskiwać dostęp do dowolnego elementu strumienia Google Classroom, który zawiera co najmniej 1 załącznik dodatku, a także go modyfikować, oddawać, odzyskiwać i zwracać bez względu na to, kto utworzył element strumienia. Elementy strumienia to dowolne przypisania Announcement, CourseWork i CourseWorkMaterial.

Aby to zademonstrować, dodasz trasę, aby zmodyfikować dany element strumienia. Użyj tej metody, aby sprawdzić, czy masz dostęp do elementów strumienia utworzonych przez siebie za pomocą interfejsu API oraz przez nauczyciela za pomocą interfejsu Google Classroom, i możesz je modyfikować.

Dodaj jeszcze 1 link lub przycisk do strony internetowej edytowanej po raz pierwszy w tym przewodniku. Powinna otworzyć się nowa trasa do modyfikacji przypisania CourseWork.

Python

Podany przykład Pythona modyfikuje trasę /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ą trasę do obsługi tras związanych z CourseWork. Znajdziesz to w pliku coursework_routes.py z podanego przykładu.

# 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 podane przykłady korzystają z zakodowanych na stałe identyfikatorów zajęć i przypisań. Aby uzyskać te identyfikatory, wyślij żądania z danymi logowania nauczyciela do metod get i list w zasobach courses i courseWork. Są one również zwracane w odpowiedzi podczas tworzenia courseWork projektów.

Uruchom serwer, a następnie wejdź na stronę indeksu i zaloguj się jako nauczyciel bez licencji Google Workspace for Education Teaching & Learning lub Plus. Możesz zmienić stan licencji użytkownika w konsoli administracyjnej domeny testowej.Kliknij przycisk Utwórz projekt CourseWork, a następnie otwórz interfejs Google Classroom i sprawdź, czy projekt z załącznikiem z linkiem do materiału został utworzony. Załącznik powinien zawierać tytuł linkowanej strony internetowej i adres URL.

Testowe tworzenie przyłącza 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 CourseWork, a następnie otwórz interfejs Google Classroom i sprawdź, czy projekt z załącznikiem dodatku został utworzony. Załącznik powinien zawierać nazwę aplikacji dodatku i tytuł określony w kodzie.

Zmiana przypisania testowego

Wróć na stronę indeksu i sprawdź, czy logujesz się jako nauczyciel z licencją Teaching and Learning lub Plus. Kliknij przycisk Modyfikuj projekt CourseWork, a następnie wróć do interfejsu Google Classroom i sprawdź, czy tytuł projektu został zmieniony.

Gratulacje! To już wszystkie instrukcje.