Harici ekler ve teslim etme

Bu, Classroom eklentileri açıklamalı kılavuz serisinin yedinci bölümüdür.

Bu adım adım açıklamalı kılavuzda, Google Classroom dışından eklenti ekleri oluşturmak için bir web uygulamasına davranış ekleyeceksiniz. Kullanıcılarınızın mevcut ürününüzden veya web sitenizden eklenti ekleri oluşturmasına izin vermek için bu davranışı kullanın. Mevcut trafiği akışlarını değiştirmeden eklentinizin sunduğu gelişmiş kullanıcı deneyimine yönlendirdiğiniz için bu, CourseWork entegrasyonuna mükemmel bir katkıdır. Önerilen süreç, Classroom dışında ek oluşturma rehber sayfamızda sunulmaktadır.

Ayrıca, eklenti ekleriyle bir ödevi programatik olarak değiştirmek için eklentinize davranış da eklersiniz. Ödevi kimin oluşturduğundan bağımsız olarak, eklenti eklerinizden birini içeren tüm ödevleri değiştirebilirsiniz. Bu özellik, özellikle öğrenci bir etkinliği tamamladıktan sonra ödevleri teslim etmek için kullanışlıdır. Bu sayede öğretmene, atanan görevlerin tamamlandığını ve öğrencinin çalışmasının incelenmeye hazır olduğunu bildirebilirsiniz.

Eklentinizin content-type veya activity-type ekleri destekleyen son sürümünü genişletmeniz gerekir. Bu kılavuzda içerik türü eki kullanılmaktadır.

Ödev yönetimi OAuth kapsamını ekleme

Uygulamanızın aşağıdaki kapsamları istediğinden emin olun:

  • https://www.googleapis.com/auth/classroom.addons.teacher
  • https://www.googleapis.com/auth/classroom.addons.student
  • https://www.googleapis.com/auth/classroom.coursework.students

classroom.coursework.students kapsamı daha önce gerekli olmamıştır ve CourseWork atamaları oluşturmak veya değiştirmek için kullanılır. Bu kapsamı, Cloud projenizin Google Workspace Marketplace SDK'sındaki, OAuth izin ekranındaki ve sunucu kodunuzdaki kapsam listelerine ekleyin.

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",
  ]

Classroom'da ödev oluşturma

Iframe içermeyen bir web sayfasına düğme ekleme

Bu adım adım açıklamalı kılavuzda açıklanan akış, kullanıcıların Google dışı bir üründen Google Classroom ödevleri ve ekleri oluşturmasına olanak tanır. Bu, genellikle mevcut web siteniz veya uygulamanızdır. Bu örnek için harici site olarak kullanılacak bir web sayfası oluşturmanız gerekir. Yeni bir ödev oluşturmak için tıklandığında önerilen CourseWork akışını gerçekleştiren yeni bir rota açan bir düğmeye veya bağlantıya ihtiyacınız vardır.

Henüz yoksa kullanıcıya oturum açmasına izin verecek bir düğme veya bağlantı eklemeniz de gerekir. Sonraki API isteklerini göndermek için kullanıcı kimlik bilgilerine ihtiyacınız olacağından OAuth 2.0 el sıkışma işlemini tamamlamaları gerekir. Ayrıntılı bilgi için giriş adım adım kılavuzunu inceleyin.

Python

Sağlanan Python örneğinde, ilk yol gösterici adımda tanıtılan /index yolu değiştirilmektedir.

<!-- /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>

Web sitenizde bir hedefi temsil etmek için HTML şablonu ekleyin. Bu sayfa, CourseWork ödevinize eklenecek içeriği temsil eder.

<!-- /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>

CourseWork ile ilgili rotaları işlemek için yeni bir Python modülü dosyası oluşturun. Bu, verdiğimiz örnekte coursework_routes.py'tir. Aşağıdaki üç rotayı ekleyin. İçeriklerin bir kısmını daha sonra dolduracağınızı unutmayın.

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

Bir kullanıcının ek oluşturma uygunluğunu kontrol etme

Kullanıcı adına eklenti ekleri oluşturabilmeniz için kullanıcının karşılaması gereken birkaç ön koşul vardır. Google, kullanıcının bu ön koşulları karşılayıp karşılamadığını belirlemek için kolaylık sağlamak amacıyla userProfiles.checkUserCapability yöntemini sağlar. Ön koşulları karşılayan kullanıcılara uygun kullanıcı denir.

Uygunluk kontrolünü CourseWork oluşturma yolu uygulamasına ekleyin. Ardından, yanıttaki allowed alanını test edin. Uygun kullanıcılar için eklenti eki içeren bir ödev oluşturma mantığını uygulayın. Aksi takdirde Bağlantı Malzemesi oluşturun. Kullanıcının ödev oluşturmak istediği dersin kimliğini bilmeniz gerekir. Normalde kullanıcıdan hangi kursu kullanacağını belirtmesini istersiniz. Kolay anlaşılması için bu örnekte sabit kodlanmış bir değer kullanıyoruz.

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.

Uygun kullanıcılar için eklenti eki içeren bir ödev oluşturma

Kullanıcı eklenti eki oluşturmaya uygunsa aşağıdakileri yapın:

  1. Google Classroom'da ek içermeyen bir courseWork ödevi oluşturmak için API isteği gönderin.
  2. Yeni oluşturulan ödevin id değerini ayıklayın.
  3. Yeni bir Ödev AddOnAttachment oluşturun.
  4. Google Classroom'da yeni oluşturulan ödevde eklenti eki oluşturma isteği gönderin.

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

Kullanıcı, eklenti eki oluşturmaya uygun değilse aşağıdakileri yaparak bunun yerine bir Materyal Bağlantısı oluşturun:

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

Daha önce oluşturulmuş bir ödevde değişiklik yapma

Akış öğesini kim oluşturduysa oluştursun, eklenti eklerinizden en az birine sahip olan tüm Google Classroom akış öğelerine erişebilir, bunları değiştirebilir, teslim edebilir, yeniden talep edebilir veya iade edebilirsiniz. Akış öğeleri, Announcement, CourseWork ödevi veya CourseWorkMaterial'dir.

Bunu göstermek için belirli bir akış öğesini değiştirmek üzere bir rota ekleyeceksiniz. API'yi kullanarak oluşturduğunuz ve bir öğretmen tarafından Google Classroom kullanıcı arayüzü üzerinden oluşturulan canlı yayın öğelerine erişip bunları değiştirebildiğinizi doğrulamak için bu yöntemi kullanın.

Bu adım adım açıklamalı kılavuzda ilk kez düzenlediğiniz web sayfasına bir bağlantı veya düğme daha ekleyin. Bu işlem, CourseWorkatama

Python

Sağlanan Python örneği, bu adım adım açıklamalı kılavuzun önceki bölümlerinde değiştirilen /index rotasını değiştirir.

<!-- /webapp/templates/index.html -->
<a href="modify-coursework-assignment.html">Create a CourseWork Assignment</a>

CourseWork ile ilgili rotaları işlemek için yeni bir rota oluşturun. Bu, sağladığımız örnekteki coursework_routes.py dosyasındadır.

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

Eklentiyi test etme

Basitlik sağlamak için verilen örneklerde sabit kodlanmış kurs ve ödev tanımlayıcıları kullanılmıştır. Bu tanımlayıcıları, öğretmen kimlik bilgileriyle courses ve courseWork kaynaklarının get ve list yöntemlerine istek göndererek alabilirsiniz. Bu değerler, ödevler oluşturulurken de yanıtta döndürülür.courseWork

Sunucunuzu çalıştırın, ardından dizin sayfanıza gidin ve Google Workspace for Education Teaching & Learning veya Plus lisansı olmayan bir öğretmen kullanıcısı olarak oturum açın. Test alanınızın Yönetici Konsolu'ndan kullanıcı lisans durumunu değiştirebilirsiniz.Ders Ödevi Oluştur düğmesini tıklayın, ardından Google Classroom kullanıcı arayüzünü açın ve Bağlantı Materyali eki içeren bir ödevin oluşturulduğunu doğrulayın. Ekte, bağlı web sayfasının başlığı ve URL'si gösterilmelidir.

Eklenti eki oluşturma işlemini test etme

Dizin sayfasına dönün ve Google Workspace for Education Teaching and Learning veya Plus lisansına sahip bir öğretmen kullanıcısı olarak oturum açın. Ödev Oluştur düğmesini tıklayın, ardından Google Classroom kullanıcı arayüzünü açın ve eklenti eki içeren bir ödevin oluşturulduğunu doğrulayın. Ekte, eklenti uygulamanızın adı ve kodunuzda belirtilen başlık gösterilmelidir.

Test atama değişikliği

Dizin sayfasına dönün ve Teaching and Learning veya Plus lisansına sahip bir öğretmen kullanıcısı olarak oturum açtığınızdan emin olun. Ödevi Değiştir düğmesini tıklayın, ardından Google Classroom kullanıcı arayüzüne dönüp ödev başlığının değiştirildiğini doğrulayın.

Tebrikler! Rehberli tur serisini tamamladınız.