Etkinlik türü ekler

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

Bu adım adım açıklamalı kılavuzda, önceki adım adım açıklamalı kılavuzdaki örneği değiştirerek etkinlik türündeki bir ek oluşturursunuz. Yazılı yanıt, sınav veya öğrenci tarafından oluşturulan diğer öğeler gibi öğrencinin göndermesi gereken tüm ekler bu kapsamdadır.

İçerik türü ve etkinlik türü ekleri arasındaki fark önemlidir. Etkinlik türündeki ekler, içerik türünden aşağıdaki yönlerden farklıdır:

  • Öğrenci Görünümü iFrame'sinin sağ üst kısmında bir "Teslim Et" düğmesi görünür.
  • Öğrenci çalışmaları için benzersiz bir tanımlayıcı sağlar.
  • Ekleme kartı, Classroom not verme kullanıcı arayüzünde gösterilir.
  • Ödeve ait notu belirleyebilirler.

Notlandırma hakkında bilgi edinmek için sonraki adım adım açıklamalı kılavuza bakın. Bu adım adım açıklamalı kılavuzda şunları tamamlarsınız:

  • Etkinlik türündeki bir ek oluşturmak için Classroom API'ye gönderilen önceki ek oluşturma isteklerini değiştirin.
  • Öğrenci gönderimleri için kalıcı depolama alanı uygulayın.
  • Önceki Öğrenci Görünümü rotasını, öğrenci girişini kabul edecek şekilde değiştirin.
  • Öğrenci Çalışması İncelemesi iframe'inin yayınlanacağı bir rota sağlayın.

Bu işlemi tamamladıktan sonra, öğretmen olarak oturum açtığınızda Google Classroom kullanıcı arayüzünü kullanarak ödevlere etkinlik türündeki ekler oluşturabilirsiniz. Sınıftaki öğrenciler de aktiviteyi iframe'da tamamlayıp yanıt gönderebilir. Öğretmen, Classroom not verme kullanıcı arayüzünde öğrencinin gönderimini görüntüleyebilir.

Bu örnek için önceki adım adım açıklamalı kılavuzda yer alan, ünlü bir önemli yerin resmini ve önemli yerin adını içeren bir altyazı gösteren ek şablonunu yeniden kullanın. Etkinlik, öğrenciden önemli yerin adını vermesini istemekten oluşur.

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

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

Tüm eklenti ekleri için bu üç alan gerekli olsa da studentWorkReviewUri değerinin varlığı veya yokluğu, ekin etkinlik türü mü yoksa içerik türü mü olduğunu belirler. studentWorkReviewUri doldurulmuş bir CREATE isteği etkinlik türündeki bir ek olur. studentWorkReviewUri doldurulmamış bir CREATE isteği ise içerik türündeki bir ek olur.

Bu istekte yapılması gereken tek değişiklik, studentWorkReviewUri alanının doldurulmasıdır. Buraya uygun şekilde adlandırılmış bir rota ekleyin. Bu rotayı daha sonraki bir adımda uygulayacaksınız.

Python

Bu, verdiğimiz örnekte 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ündeki ekler için kalıcı depolama alanı ekleme

Öğrencinin etkinliğimize verdiği yanıtı kaydedin. Öğretmen, Öğrenci Çalışması İncelemesi iframe'inde gönderimi görüntülediğinde bu numarayı daha sonra görebilirsiniz.

Submission için bir veritabanı şeması oluşturun. Sağlanan örnekte, öğrencilerin bir resimde gösterilen yer işaretinin adını girmeleri beklenir. Bu nedenle, Submission aşağıdaki özellikleri içerir:

  • attachment_id: Ekin için benzersiz tanımlayıcı. Classroom tarafından atanır ve ek oluşturulurken yanıtta döndürülür.
  • submission_id: Öğrenci gönderimi için 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: Öğrenci tarafından verilen yanıt.

Python

Önceki adımlardaki SQLite ve flask_sqlalchemy uygulamasını genişletin.

Önceki tabloları tanımladığınız dosyaya gidin (sağladığımız örneği izliyorsanız models.py). Aşağıdakileri dosyanın alt kısmına 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 giriş kabul edecek şekilde değiştirin. Önceki adım adım açıklamalı kılavuzun kodunun çoğunu yeniden kullanabilirsiniz.

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

Python

Bu, verdiğimiz örnekte 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 istek de gönderebilirsiniz. Yanıt, öğrencinin eki açıp açmadığını veya teslim edip etmediğini belirten bir SubmissionState değeri içerir. Teslim edilen bir gönderinin düzenlenmesine izin vermek istemiyorsanız veya öğretmenlere öğrencilerinin ilerleme durumuyla ilgili analizler sunmak istiyorsanız bu seçenek faydalı olabilir:

Python

Bu, sunduğumuz ö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ıp bir giriş formu sunuyoruz. Sunduğumuz örnekteki form, bir dize giriş alanından ve gönder düğmesinden oluşur. Öğrenciye yer işareti resmini gösterin ve adını girmesini isteyin. Aldığınız yanıtı veritabanımıza kaydedin.

Python

Bu, sunduğumuz ö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 arasında ayrım yapmak için gönderme işlevini devre dışı bırakıp bunun yerine öğretmen görünümünde doğru cevabı gösterebilirsiniz.

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

Son olarak, Öğrenci Çalışması İncelemesi iFrame'sini yayınlamak için bir rota ekleyin. Bu yolun adı, ek oluştururken studentWorkReviewUri için sağlanan adla eşleşmelidir. Bu rota, öğretmen Classroom notlandırıcı kullanıcı arayüzünde öğrenci gönderimini görüntülediğinde açılır.

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

Python

Bu, verdiğimiz örnekte 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ılavuzun "Eklentiyi test etme" adımları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 öğrenci test kullanıcılarınızdan biri olarak Google Classroom'da oturum açın.
  • Sınıf çalışmaları sekmesine gidin ve testi Ödev olarak genişletin.
  • Öğrenci Görünümü'nü açmak ve etkinlik için 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 Etkinleştir düğmesini tıklayın.

Etkinliği tamamladıktan sonra Classroom'da herhangi bir değişiklik görmezsiniz. Şimdi Öğrenci Çalışması İncelemesi 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ının kartını bulun. Karttaki eki tıklayın.

Öğrenci için doğru gönderimin gösterildiğini onaylayın.

Tebrikler! Sonraki adıma (ek notları senkronize etme) geçmeye hazırsınız.