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, etkinlik türü eki oluşturmak için önceki adım adım açıklama bölümündeki örneği değiştiriyorsunuz. 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ü ekler, içerik türü eklerden ş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 adım adım açıklama bölümüne bakın. Bu kılavuzda aşağıdaki işlemleri yapacaksınız:

  • Etkinlik türünde 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ü 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ın yer aldığı 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, AddOnAttachment nesnesinin bir örneğidir. Bu nesnede, ek için daha önce teacherViewUri, studentViewUri ve title değerlerini belirtmiştik.

Tüm eklenti eklerinde bu üç alanın bulunması gerekir. studentWorkReviewUri simgesinin ekte bulunup bulunmaması, ekin etkinlik türü mü yoksa içerik türü mü olduğunu belirler. CREATE ile doldurulmuş bir studentWorkReviewUri istek, etkinlik türü ek olurken CREATE olmadan gönderilen bir studentWorkReviewUri istek, içerik türü ek olur.

Bu istekle ilgili olarak 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ğlanan örneğimizde 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 bu bilgiyi daha sonra arayabilirsiniz.

Submission için bir veritabanı şeması oluşturun. Sağladığımız örnekte, öğrencilerin bir 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 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ğladığımız örnekte 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şur. Önemli yerin resmini gösterin ve öğrenciden adını girmesini isteyin. Yanıt verdiklerinde bu yanıtı veritabanımıza kaydedin.

Python

Sağladığımız örnekte 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önder işlevini devre dışı bırakıp bunun yerine Öğretmen Görünümü'nde doğru yanıtı göstermeyi düşünebilirsiniz.

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

Son olarak, öğrenci çalışmalarının incelemesi 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ının kullanıcı arayüzünde görüntülediğinde açılır.

Classroom, öğrenci çalışması inceleme iFrame'ini açtığında submissionId sorgu parametresini alırsınız. Öğrencinin çalışmalarını yerel veritabanınızdan almak için bu aracı 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. Öğrencinin açabileceği 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ı inceleme 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! Ek notları senkronize etme adlı sonraki adıma geçmeye hazırsınız.