Etkinlik türü ekler

Bu, Classroom eklentileri adım adım açıklamalı beşinci kılavuzudur.

Bu adım adım açıklamalı kılavuzda, önceki adım adım açıklamalı kılavuzda bulunan örneği değiştirerek bir etkinlik türü eki oluşturacaksınız. Bunlar, yazılı yanıt, test veya öğrenci tarafından oluşturulan başka bir yapı gibi öğrencinin göndermesi gereken tüm eklerdir.

İçerik türü ile etkinlik türü ekler arasındaki fark önemlidir. Etkinlik türü ekler, içerik türünden şu yönleriyle farklıdır:

  • Öğrenci Görünümü iframe'inin sağ üst kısmında "Teslim Et" düğmesi görünür.
  • Öğrenci çalışmaları için benzersiz bir tanımlayıcı sağlar.
  • Kullanıcının ek kartı, Classroom'da not veren kullanıcının kullanıcı arayüzünde gösterilir.
  • Ait oldukları ödev için bir not verebilirler.

Not vermeyle ilgili tartışma için bir sonraki adım adım açıklamalı kılavuzu inceleyin. Bu adım adım açıklamalı kılavuzda şunları tamamlayacaksınız:

  • Etkinlik türü eki oluşturmak için önceki ek oluşturma isteklerinde Classroom API'yi değiştirin.
  • Öğrencilerin gönderimleri için kalıcı depolama alanı uygulayın.
  • Öğrenci girişini kabul etmek için önceki Öğrenci Görünümü rotasını değiştirin.
  • Öğrenci Çalışma İncelemesi iframe'ini sunmak için bir yol sağlayın.

İşiniz bittiğinde, öğretmen olarak giriş yaptığınızda Google Classroom kullanıcı arayüzü üzerinden ödevlerde etkinlik türü ekler oluşturabilirsiniz. Sınıftaki öğrenciler de iframe'de etkinliği tamamlayıp yanıt gönderebilir. Öğretmen, Classroom'daki not verme kullanıcı arayüzünde öğrencinin gönderimini görebilir.

Bu örneğin amacı doğrultusunda, önceki adım adım açıklamalı kılavuzda bulunan ek şablonunu yeniden kullanın. Bu ek, ünlü bir önemli noktanın resmini ve yer işaretinin adını içeren bir altyazı gösterir. Etkinlik, öğrenciden önemli noktanın adını söylemesini istemekten oluşur.

Ek oluşturma isteğini değiştirme

Önceki adım adım açıklamalı kılavuzda kodunuzun içerik türü eki oluşturduğunuz bölümüne gidin. Buradaki anahtar öğe, daha önce ek için teacherViewUri, studentViewUri ve title belirttiğimiz bir AddOnAttach nesnesinin örneğidir.

Tüm eklenti ekleri bu üç alanı gerekli kılsa da studentWorkReviewUri öğesinin mevcut olması veya olmaması, ekin etkinlik türü ya da içerik türü olup olmadığını belirler. studentWorkReviewUri doldurulmuş bir CREATE isteği etkinlik türü eki haline gelirken, studentWorkReviewUri içermeyen bir CREATE isteği içerik türü eki haline gelir.

Bu istekte yapılacak tek değişiklik, studentWorkReviewUri alanının doldurulmasıdır. Buraya uygun şekilde adlandırılmış bir rota ekleyin. Bunu sonraki bir adımda uygularsınız.

Python

Sağladığımız örneğimizde bu, webapp/attachment_routes.py dosyasındaki create_attachments yöntemindedir.

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

İçerik türü ekler için kalıcı depolama alanı ekleme

Öğrencinin etkinliğimize verdiği yanıtı kaydetme. Daha sonra öğretmeniniz ödevi Öğrenci Çalışmayı İnceleme iframe'inde görüntülediğinde bu araştırmaya bakabilirsiniz.

Submission için veritabanı şeması oluşturun. Sağladığımız örneğimizde, öğrencilerin resimde gösterilen önemli noktanın adını girmeleri beklenir. Bu nedenle, Submission aşağıdaki özellikleri içerir:

  • attachment_id: Eklerin benzersiz tanımlayıcısıdır. Classroom tarafından atanır ve ek oluşturulurken yanıtta geri döndürülür.
  • submission_id: Öğrenci gönderimleri için tanımlayıcı. Classroom tarafından atanır ve Öğrenci Görünümü'nde getAddOnContext yanıtında geri verilir.
  • student_response: Öğrencinin verdiği cevap.

Python

Önceki adımlarda açıklanan SQLite ve flask_sqlalchemy uygulamasını genişletin.

Önceki tabloları tanımladığınız dosyaya gidin (verdiğimiz örneği takip ediyorsanız models.py). Dosyanın alt kısmına aşağıdakini ekleyin.

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

Yeni Submission sınıfını, ek işleme rotalarınızla birlikte sunucu dosyasına aktarın.

Öğrenci Görünümü rotasını değiştirme

Sonra, önceki Öğrenci Görünümü rotasını küçük bir form gösterecek şekilde değiştirin ve öğrenciden gelen girişi kabul edin. Önceki adım adım açıklamalı kılavuzda bulunan kodun çoğunu yeniden kullanabilirsiniz.

Öğrenci Görünümünüz için rotayı sağlayan sunucu kodunu bulun. Bu, ek oluşturulurken studentViewUri alanında belirtilen rotadır. Yapılacak ilk değişiklik, getAddOnContext yanıtından submissionId öğesini çıkarmaktır.

Python

Sağladığımız örneğimizde bu, webapp/attachment_routes.py dosyasındaki load_activity_attachment yöntemindedir.

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

Öğrenci gönderim durumunu öğrenmek için de bir istekte bulunabilirsiniz. Yanıt bir SubmissionState değeri içerir. Bu değer, öğrencinin eki açıp açmadığı veya teslim edip etmediği gibi durumları gösterir. Teslim edilen bir ödevde düzenlemelere izin vermek istemiyorsanız veya öğretmenlere öğrencilerinin ilerleme durumuyla ilgili analizler sunmak istiyorsanız bu özellik işinize yarayabilir:

Python

Sağladığımız örneğimizde bu, yukarıdaki load_activity_attachment yönteminin devamıdır.

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

Son olarak, veritabanımızdan ek bilgilerini alın ve bir giriş formu sunun. Sağladığımız örneğimizdeki form, bir dize giriş alanından ve bir gönder düğmesinden oluşur. Önemli noktayı gösteren resmi gösterin ve öğrenciden adını girmesini isteyin. Sizden yanıt aldıktan sonra yanıtı veritabanımıza kaydedin.

Python

Sağladığımız örneğimizde bu, yukarıdaki load_activity_attachment yönteminin devamıdır.

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

Kullanıcıları birbirinden ayırt etmek için gönderme işlevini devre dışı bırakmayı ve bunun yerine Öğretmen Görünümü'nde doğru yanıtı göstermeyi düşünebilirsiniz.

Öğrenci Çalışma İncelemesi iframe'i için rota ekleme

Son olarak, Öğrenci Çalışması İncelemesi iframe'ini sunmak için bir rota ekleyin. Bu rotanın adı, ek oluşturulurken studentWorkReviewUri için sağlanan adla eşleşmelidir. Bu rota, öğretmen Classroom'daki not veren kullanıcı arayüzünde öğrenci gönderimini görüntülediğinde açılır.

Classroom, Öğrenci Çalışma İncelemesi iframe'ini açtığında submissionId sorgu parametresini alırsınız. Bu dosyayı, öğrencinin çalışmasını yerel veritabanınızdan almak için kullanın:

Python

Sağlanan örneğimizde bu, webapp/attachment_routes.py dosyasındadır.

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

Eklentiyi test etme

Önceki adım adım açıklamalı kılavuzda yer alan eklenti adımlarını test etme bölümünü tekrarlayın. Öğrenci tarafından açılabilecek bir ekiniz olmalıdır.

Etkinlik ekini test etmek için aşağıdaki adımları uygulayın:

  • Öğretmen test kullanıcısıyla aynı sınıftaki öğrencinizin test kullanıcılarından biri olarak Google Classroom'da oturum açın.
  • Sınıf Çalışmaları sekmesine gidin ve test amaçlı Ödev'i genişletin.
  • Eklenti ek kartını tıklayarak Öğrenci Görünümü'nü açın ve etkinlikle ilgili bir yanıt gönderin.
  • Etkinliği tamamladıktan sonra iframe'i kapatın. İsterseniz Teslim Et düğmesini tıklayın.

Etkinliği tamamladıktan sonra Classroom'da herhangi bir değişiklik olmaz. Şimdi Öğrenci Çalışması İnceleme iframe'ini test edin:

  • Classroom'da öğretmen test kullanıcısı olarak oturum açın.
  • Notlar sekmesinde test ödevinizin sütununu bulun. Test atamanızın adını tıklayın.
  • Test öğrencisinin kartını bulun. Karttaki eki tıklayın.

Öğrenci için doğru gönderimin göründüğünü doğrulayın.

Tebrikler! Sonraki adıma geçmeye hazırsınız: Ek notlarını senkronize etme.