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 ayrım ö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.
- Eki, Classroom not verme aracının kullanıcı arayüzünde gösterilir.
- Ait oldukları ödev için not verebilirler.
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ı tamamlayacaksı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 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 aktiviteyi iframe'da tamamlayıp yanıt gönderebilir. Öğretmen, Classroom'daki not verme kullanıcı arayüzünde öğrencinin gönderimini görebilir.
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 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 önemli öğe, daha önce ek için teacherViewUri
, studentViewUri
ve title
özelliklerini 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 olurken studentWorkReviewUri
doldurulmamış bir CREATE
isteği içerik türündeki bir ek olur.
Bu istekte yapılacak 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 bulabilirsiniz.
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
: 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önderimi için bir tanımlayıcı. Classroom tarafından atanır ve öğrenci görünümündekigetAddOnContext
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ılavuzda yer alan 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, 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 ödevde düzenlemelere izin vermek istemiyorsanız veya öğretmenlere öğrencilerinin ilerleme durumuyla ilgili analizler sunmak istiyorsanız bu özellik işinize yarayabilir:
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, veritabanımızdan ek bilgilerini alın ve bir giriş formu sunun. 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ı 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ış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 rotanın 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 yöntemi 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 olmaz. Ardından Öğ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.