Etkinlik türü ekler

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

Bu adım adım açıklamalı kılavuzda, etkinlik türünde bir ek oluşturmak için önceki adım adım açıklamalı örneği değiştirirsiniz. Bunlar, yazılı yanıt, test veya öğrenciler tarafından oluşturulan başka bir eser gibi öğrencinin ödevini gerektiren eklerdir.

İçerik türü ve etkinlik türü ekleri arasındaki ayrım önemlidir. Etkinlik türü ekleri içerik türünden şu açıdan farklıdır:

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

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

  • Etkinlik türü bir ek oluşturmak için, Classroom API'ye yönelik önceki ek oluşturma isteklerini değiştirin.
  • Öğrenci 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ışması İncelemesi iframe'ini yayınlamak için bir yol belirtin.

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

Bu örnekte, ünlü bir önemli noktanın resmini ve yer işaretinin adını içeren bir başlığı gösteren önceki adım adım açıklamalı kılavuzdaki ek şablonunu yeniden kullanın. Etkinlik, öğrenciden önemli noktanın adını vermesini istemeyi içerir.

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

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

Tüm eklenti ekleri bu üç alanı gerektirir. Ancak bir studentWorkReviewUri'ın mevcut olup olmaması ekin activity-type veya content-type olduğunu belirler. Doldurulmuş studentWorkReviewUri içeren bir CREATE isteği etkinlik türünde ek haline gelirken studentWorkReviewUri içermeyen CREATE isteği içerik türünde ek 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 uygulayacaksınız.

Python

Verdiğimiz örnekte 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ı kaydedin. Öğretmen, ödevi Öğrenci Çalışması İncelemesi iframe'inde görüntülediğinde notlarınıza bakabilirsiniz.

Submission için veritabanı şeması ayarlayın. Verdiğimiz örnekte öğrencilerden, bir resimde gösterilen önemli noktanın adını girmeleri beklenmektedir. Dolayısıyla, Submission aşağıdaki özellikleri içerir:

  • attachment_id: Bir ekin benzersiz tanımlayıcısıdır. Classroom tarafından atanır ve ek oluşturulurken verilen yanıtta döndürülür.
  • submission_id: Öğrencinin gönderdiği bir tanımlayıcı. Classroom tarafından atanır ve Öğrenci Görünümü'ndeki getAddOnContext yanıtında döndürülür.
  • student_response: Öğrencinin verdiği yanıt.

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 izliyorsanız models.py). Dosyanın en altına aşağıdaki bölümü 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

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

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

Python

Verilen örnekte 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")

Ayrıca, öğrenci gönderim durumunu öğrenmek için bir istek gönderebilirsiniz. Yanıt, öğrencinin eki açıp açmadığı veya teslim edip etmediği gibi durumları gösteren bir SubmissionState değeri içerir. Bu, teslim edilmiş bir gönderimde düzenlemelere izin vermek istemiyorsanız veya öğretmenlere, öğrencilerinin ilerleme durumuyla ilgili analizler sağlamak istiyorsanız yararlı olabilir:

Python

Verilen örnekte, 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, ek bilgilerini veritabanımızdan alın ve bir giriş formu sunun. Verdiğimiz örnekteki form, bir dize giriş alanından ve gönder düğmesinden oluşur. Önemli nokta resmini gösterin ve öğrenciden bu resmin adını girmesini isteyin. Verdikleri yanıtı veritabanımıza kaydedin.

Python

Verilen örnekte, 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 edebilmek için gönderme işlevini devre dışı bırakın ve bunun yerine doğru yanıtı Öğretmen Görünümü'nde gösterin.

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

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

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

Python

Bu, verdiğimiz örnekte webapp/attachment_routes.py dosyasında yer almaktadı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 bulunan eklenti adımlarını test edin 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:

  • Google Classroom'da, öğretmen test kullanıcısıyla aynı sınıftaki öğrenci test kullanıcılarınızdan biri olarak oturum açın.
  • Sınıf Çalışmaları sekmesine gidin ve testi Ödev'i genişletin.
  • Öğrenci Görünümü'nü açmak ve etkinlik için bir yanıt göndermek üzere eklenti eki kartını tıklayın.
  • Etkinliği tamamladıktan sonra iframe'i kapatın. İsteğe bağlı olarak Teslim Et düğmesini tıklayın.

Etkinliği tamamladıktan sonra Classroom'da herhangi bir değişiklik olmayacaktır. Ş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 ödevinizin adını tıklayın.
  • Test öğrencisi kullanıcısının kartını bulun. Karttaki eki tıklayın.

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

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