هذه هي الجولة الخامسة في سلسلة الجولات المفصّلة حول إضافات Classroom.
في هذه الجولة الإرشادية، ستُعدّل المثال من خطوة الجولة الإرشادية السابقة لإنشاء مرفق من النوع "نشاط". هذه هي أي مرفقات تتطلّب إرسالها من قِبل الطالب، مثل ردّ مكتوب أو اختبار أو أي ملف آخر ينشئه الطالب.
من المهم التمييز بين المرفقات من نوع المحتوى وتلك من نوع النشاط. تختلف المرفقات من نوع النشاط عن المرفقات من نوع المحتوى بالطرق التالية:
- يظهر زر "إرسال" في أعلى يسار إطار iframe في "عرض الطالب".
- وتوفّر هذه الأرقام معرّفًا فريدًا لأعمال الطلاب.
- تظهر بطاقة المرفق في واجهة مستخدم "مصحّح الدرجات" في Classroom.
- ويمكنهم تحديد درجة للمهمة التي ينتمون إليها.
اطّلِع على الجولة الإرشادية التالية لمناقشة عملية وضع الدرجات. خلال هذه الرحلة، ستكمل ما يلي:
- عدِّل طلبات إنشاء المرفقات السابقة المرسَلة إلى واجهة برمجة التطبيقات Classroom API لإنشاء مرفق من النوع نشاط.
- تنفيذ سعة تخزين ثابتة لعمليات إرسال الطلاب
- عدِّل مسار "عرض الطالب" السابق لقبول إدخالات الطلاب.
- قدِّم مسارًا لعرض الإطار iframe الخاص بميزة "مراجعة أعمال الطلاب".
بعد الانتهاء، يمكنك إنشاء مرفقات من النوع "نشاط" في المهام من خلال واجهة مستخدم Google Classroom عند تسجيل الدخول كمعلّم. يمكن للطلاب في الصف أيضًا إكمال النشاط في إطار iframe وإرسال ردّ. يمكن للمعلّم عرض ما أرسله الطالب في واجهة مستخدم وضع الدرجات في Classroom.
لأغراض هذا المثال، يمكنك إعادة استخدام نموذج المرفق من الخطوة السابقة التي تعرض صورة لمعلم شهير وتعليقًا توضيحيًا يتضمن اسم المعلم. يتألف النشاط من مطالبة الطالب بتقديم اسم المَعلم.
تعديل طلب إنشاء المرفق
انتقِل إلى قسم الرمز الذي أنشأت فيه مرفقًا بنوع المحتوى
في الشرح السابق. العنصر الرئيسي هنا هو مثيل لمحاولة
AddOnAttachment، حيث حدّدنا سابقًا teacherViewUri
و
studentViewUri
وtitle
للمرفق.
على الرغم من أنّ جميع المرفقات الإضافية تتطلّب هذه الحقول الثلاثة، يحدِّد توفُّر studentWorkReviewUri
أو عدم توفّره ما إذا كان المرفق هو
نوع نشاط أو نوع محتوى. يصبح طلب CREATE
الذي يحتوي على
studentWorkReviewUri
مملوءًا مرفقًا من النوع "نشاط"، في حين يصبح طلب CREATE
بدون studentWorkReviewUri
مرفقًا من النوع "محتوى".
التعديل الوحيد الذي يجب إجراؤه على هذا الطلب هو تعبئة حقل
studentWorkReviewUri
. أضِف مسارًا يحمل اسمًا مناسبًا هنا، وسيكون عليك تنفيذه في خطوة لاحقة.
Python
في المثال الذي قدّمناه، يظهر ذلك في طريقة create_attachments
في ملف
webapp/attachment_routes.py
.
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}",
}
إضافة مساحة تخزين دائمة للمرفقات من نوع المحتوى
سجِّل ردّ فعل الطالب على نشاطنا. يمكنك البحث عنه لاحقًا عندما يعرض المعلّم العمل الذي تم إرساله في إطار iframe الخاص بمراجعة عمل الطالب.
إعداد مخطّط قاعدة بيانات Submission
في المثال المقدَّم، على
الطلاب إدخال اسم المَعلم المعروض في الصورة. وبالتالي، يحتوي Submission
على السمات التالية:
attachment_id
: معرّف فريد لمرفق تم تعيينه من قِبل Classroom ويتم إرجاعه في الاستجابة عند إنشاء مرفق.submission_id
: معرّف لإرسال طالب تم تعيينها من قِبل Classroom وتم إرجاعها فيgetAddOnContext
الاستجابة في عرض "الطالب".
student_response
: الإجابة التي قدّمها الطالب.
Python
توسيع نطاق تنفيذ SQLite وflask_sqlalchemy
من الخطوات السابقة
انتقِل إلى الملف الذي حدّدت فيه الجداول السابقة
(models.py
إذا كنت تتّبع المثال المقدَّم). أضِف ما يلي في
أسفل الملف.
# 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))
استورِد فئة Submission
الجديدة إلى ملف الخادم مع مسارات معالجة المرفقات.
تعديل مسار "عرض المحتوى كطالب"
بعد ذلك، عدِّل مسار "عرض الطالب" السابق لعرض نموذج صغير وقبول مدخلات من الطالب. يمكنك إعادة استخدام معظم الرمز البرمجي من الخطوات السابقة الموضَّحة في الدليل.
حدِّد موقع رمز الخادم الذي يقدّم المسار لعرض "نظرة الطالب". هذا هو
المسار المحدّد في حقل studentViewUri
عند إنشاء مرفق.
أول تغيير يجب إجراؤه هو استخراج submissionId
من
getAddOnContext
response.
Python
في المثال الذي قدّمناه، يمكنك العثور على هذا الإجراء في load_activity_attachment
في
ملف webapp/attachment_routes.py
.
# 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")
يمكنك أيضًا تقديم طلب للحصول على حالة إرسال الطالب.
يحتوي الردّ على قيمة SubmissionState
، والتي تشير إلى حالات مثل
ما إذا كان الطالب قد فتح المرفق أو أرسله. قد يكون هذا الإجراء مفيداً
إذا كنت تريد عدم السماح بإجراء تعديلات على عمل تم إرساله، أو إذا كنت
مهتمًا بتزويد المعلّمين بإحصاءات عن مستوى تقدّم طلابهم:
Python
في المثال المقدَّم، هذا هو استمرار لطريقة
load_activity_attachment
أعلاه.
# 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()
أخيرًا، نحصل على معلومات المرفق من قاعدة بياناتنا ونعرض نموذج إدخال. يتألّف النموذج في المثال المقدَّم من حقل إدخال سلسلة وزر إرسال. اعرض صورة المَعلم واطلِب من الطالب إدخال اسمه. بعد أن يقدّم الفريق ردًا، سجِّله في قاعدة بياناتنا.
Python
في المثال المقدَّم، هذا هو استمرار لطريقة
load_activity_attachment
أعلاه.
# 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)
للتمييز بين المستخدمين، ننصحك بإيقاف ميزة إرسال الجواب وعرض الإجابة الصحيحة في "عرض المعلّم" بدلاً من ذلك.
إضافة مسار لإطار iframe الخاص بمراجعة أعمال الطلاب
أخيرًا، أضِف مسارًا لعرض الإطار المتداخل لمراجعة عمل الطالب. يجب أن يتطابق اسم
هذا المسار مع الاسم المقدَّم للstudentWorkReviewUri
عند إنشاء
مرفق. يتم فتح هذا المسار عندما يطّلع المعلّم على المهام التي أرسلها الطلاب في
واجهة مستخدم "مصحّح الدرجات" في Classroom.
تتلقّى مَعلمة طلب البحث submissionId
عندما يفتح Classroom
إطار iframe الخاص بميزة "مراجعة أعمال الطلاب". استخدِم هذا الإجراء لاسترداد عمل الطالب من
قاعدة بياناتك المحلية:
Python
في المثال الذي قدّمناه، يمكنك العثور على هذا العنصر في ملف webapp/attachment_routes.py
.
@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)
اختبار الإضافة
كرِّر خطوات اختبار الإضافة من الجولة الإرشادية السابقة. يجب أن يكون لديك مرفق يمكن للطالب فتحه.
أكمِل الخطوات التالية لاختبار مرفق النشاط:
- سجِّل الدخول إلى Google Classroom بصفتك أحد مستخدمي الاختبار المخصّصين للطلاب في الصف نفسه الذي يتوفّر فيه حساب المستخدم التجريبي للمعلّم.
- انتقِل إلى علامة التبويب الواجب الدراسي ووسِّع المَهمّة الاختبارية.
- انقر على بطاقة مرفق الإضافة لفتح "عرض الطالب" وإرسال ردّ على النشاط.
- أغلِق إطار iframe بعد إكمال النشاط. اختياريًا، انقر على الزر تفعيل.
من المفترض ألا يحدث أي تغيير في Classroom بعد إكمال النشاط. اختبِر الآن إطار iframe الخاص بميزة "مراجعة أعمال الطلاب":
- سجِّل الدخول إلى Classroom بصفتك المستخدم التجريبي المعلّم.
- ابحث عن عمود مهمة الاختبار في علامة التبويب الدرجات. انقر على اسم مهمة الاختبار.
- ابحث عن بطاقة المستخدم التجريبي للطالب. انقر على المرفق في البطاقة.
تأكَّد من ظهور العينة الصحيحة التي تم إرسالها للطالب.
تهانينا! يمكنك الآن الانتقال إلى الخطوة التالية: مزامنة مرفقات علامات الصفوف.