Etkinlik türü ekler

Bu, Classroom eklentileriyle ilgili beşinci adım adım açıklama videosudur.

Bu adım adım açıklama bölümünde, önceki adım adım açıklama adımındaki örneği değiştirerek etkinlik türü eki oluşturacaksınız. Bunlar, öğrenci tarafından gönderilmesi gereken eklerdir. Örneğin, yazılı yanıt, sınav veya öğrenci tarafından oluşturulan diğer içerikler.

İçerik türü ve etkinlik türü ekleri arasındaki ayrım önemlidir. Etkinlik türü ekleri, içerik türü eklerinden şu yönleriyle farklıdır:

  • Öğrenci Görünümü iFrame'inin sağ üst kısmında "Gönder" düğmesi görünür.
  • Öğrenci çalışmalarına benzersiz bir tanımlayıcı ekler.
  • Ek kartları, Classroom not verme aracının kullanıcı arayüzünde görünür.
  • Ait oldukları ödev için not belirleyebilirler.

Notlandırma ile ilgili tartışma için sonraki kılavuza bakın. Bu kılavuzda aşağıdaki işlemleri tamamlayacaksınız:

  • Etkinlik türü ek oluşturmak için önceki ek oluşturma isteklerini Classroom API'de 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ı İnceleme iFrame'ini sunmak için bir rota sağlayın.

İşlem tamamlandıktan sonra, öğretmen olarak oturum açtığınızda Google Classroom kullanıcı arayüzü üzerinden ödevlere etkinlik türünde ekler oluşturabilirsiniz. Sınıftaki öğrenciler de iframe'deki etkinliği tamamlayıp yanıt gönderebilir. Öğretmen, öğrencinin gönderimini Classroom not verme kullanıcı arayüzünde görüntüleyebilir.

Bu örnekte, önceki adım adım açıklamadaki ek şablonunu yeniden kullanın. Bu şablonda, ünlü bir yerin resmi ve yerin adını içeren bir başlık gösterilmektedir. Bu etkinlikte öğrenciden simge yapının adını vermesi istenir.

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

Kodunuzun, önceki adım adım açıklama bölümünde içerik türü eki oluşturduğunuz bölüme gidin. Buradaki anahtar öğe, bir AddOnAttachment nesnesinin örneğidir. Bu nesnede, ek için daha önce teacherViewUri, studentViewUri ve title değerlerini belirtmiştik.

Tüm eklenti ekleri için bu üç alanın doldurulması gerekir. studentWorkReviewUri simgesinin eklenip eklenmemesi, ekin etkinlik türü mü yoksa içerik türü mü olduğunu belirler. CREATE ile doldurulmuş bir studentWorkReviewUri isteği etkinlik türü ek, CREATE olmadan yapılan bir studentWorkReviewUri isteği ise içerik türü ek olur.

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

Python

Sağladığımız örnekte bu, create_attachments dosyasındaki webapp/attachment_routes.py 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ü ekleri için kalıcı depolama alanı ekleme

Öğrencinin etkinliğimize verdiği yanıtı kaydetme Öğretmen, gönderimi Öğrenci Çalışması İnceleme iFrame'inde görüntülediğinde daha sonra arayabilirsiniz.

Submission için bir veritabanı şeması oluşturun. Sağladığımız örnekte, öğrencilerin resimde gösterilen simge yapının adını girmesi bekleniyor. Bu nedenle, Submission aşağıdaki özellikleri içerir:

  • attachment_id: Ekin benzersiz tanımlayıcısı. Classroom tarafından atanır ve ek oluşturulurken yanıtta döndürülür.
  • submission_id: Öğrenci gönderiminin tanımlayıcısı. Classroom tarafından atanır ve öğrenci görünümünde getAddOnContext yanıtı olarak döndürülür.
  • student_response: Öğrencinin verdiği yanıt.

Python

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

Önceki tabloları tanımladığınız dosyaya gidin (models.py sağladığımız örneği takip ediyorsanız). Dosyanın en altına aşağıdakileri 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çıklamadaki kodun büyük bir kısmını yeniden kullanabilirsiniz.

Öğrenci Görünümü'nüzün rotasını sağlayan sunucu kodunu bulun. Bu, ek oluştururken studentViewUri alanında belirtilen yoldur. Yapılacak ilk değişiklik, getAddOnContext yanıtından submissionId değerini çıkarmaktır.

Python

Sağladığımız ö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 durumu hakkında istekte bulunmak da isteyebilirsiniz. Yanıt, öğrencinin eki açıp açmadığı veya ödevi gönderip göndermediği gibi durumları belirten bir SubmissionState değeri içerir. Bu özellik, teslim edilen bir gönderide düzenlemelere izin vermek istemediğinizde veya öğrencilerin ilerleme durumlarıyla ilgili öğretmen analizleri sağlamak istediğinizde faydalı olabilir:

Python

Sağlanan ö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, ek bilgilerini veritabanımızdan alın ve bir giriş formu sunun. Sağladığımız örnekteki form, bir dize giriş alanı ve bir gönderme düğmesinden oluşuyor. Önemli yerin resmini gösterin ve öğrenciden adını girmesini isteyin. Kullanıcılar yanıt verdikten sonra bu yanıtları veritabanımıza kaydedin.

Python

Sağlanan ö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ı ayırt etmek için gönderim işlevini devre dışı bırakıp bunun yerine doğru yanıtı Öğretmen Görünümü'nde göstermeyi düşünebilirsiniz.

Öğrenci Çalışması İnceleme iFrame'i için bir rota ekleyin.

Son olarak, öğrenci çalışması inceleme iFrame'ine hizmet verecek bir rota ekleyin. Bu rotanın adı, studentWorkReviewUri oluşturulurken sağlanan adla eşleşmelidir. Bu rota, öğretmen öğrenci gönderimini Classroom not verme aracı kullanıcı arayüzünde görüntülediğinde açılır.

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

Python

Sağladığımız örnekte 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çıklamadaki eklentiyi test etme adımlarını tekrarlayın. Öğrenci tarafından açılabilen bir ek olmalıdır.

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

  • Google Classroom'da öğretmen test kullanıcısıyla aynı sınıfta bulunan öğrenci test kullanıcılarınızdan biri olarak oturum açın.
  • Sınıf çalışmaları sekmesine gidin ve test ödevini genişletin.
  • Öğrenci Görünümü'nü açmak ve etkinlikle ilgili yanıt göndermek için eklenti eki kartını tıklayın.
  • Etkinliği tamamladıktan sonra iFrame'i kapatın. İsteğe bağlı olarak Gönder düğmesini tıklayın.

Etkinliği tamamladıktan sonra Classroom'da herhangi bir değişiklik görmezsiniz. Ş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! Bir sonraki adıma, yani ek notları senkronize etme işlemine geçmeye hazırsınız.