এটি ক্লাসরুম অ্যাড-অন ওয়াকথ্রু সিরিজের পঞ্চম পর্ব।
এই ধাপে, আপনি পূর্ববর্তী ধাপের উদাহরণটি পরিবর্তন করে একটি অ্যাক্টিভিটি-টাইপ অ্যাটাচমেন্ট তৈরি করবেন। এই অ্যাটাচমেন্টগুলো হলো এমন সব অ্যাটাচমেন্ট যার জন্য শিক্ষার্থীর জমা দেওয়ার প্রয়োজন হয়, যেমন লিখিত উত্তর, কুইজ বা শিক্ষার্থীর তৈরি অন্য কোনো কাজ।
কন্টেন্ট-টাইপ এবং অ্যাক্টিভিটি-টাইপ অ্যাটাচমেন্টের মধ্যে পার্থক্যটি গুরুত্বপূর্ণ। অ্যাক্টিভিটি-টাইপ অ্যাটাচমেন্টগুলো নিম্নলিখিত উপায়ে কন্টেন্ট-টাইপ অ্যাটাচমেন্ট থেকে আলাদা:
- স্টুডেন্ট ভিউ আইফ্রেমের উপরের ডানদিকে একটি 'টার্ন ইন' বাটন দেখা যায়।
- এগুলো শিক্ষার্থীদের কাজের জন্য একটি অনন্য শনাক্তকারী চিহ্ন প্রদান করে।
- তাদের সংযুক্তি কার্ডটি ক্লাসরুম গ্রেডার UI-তে প্রদর্শিত হয়।
- তারা যে অ্যাসাইনমেন্টের অন্তর্ভুক্ত, তার জন্য একটি গ্রেড নির্ধারণ করতে পারে।
গ্রেডিং সম্পর্কে আলোচনার জন্য পরবর্তী ওয়াকথ্রু দেখুন। এই ওয়াকথ্রু চলাকালীন আপনি নিম্নলিখিত বিষয়গুলো সম্পন্ন করবেন:
- অ্যাক্টিভিটি-টাইপ অ্যাটাচমেন্ট তৈরি করার জন্য ক্লাসরুম এপিআই-তে পাঠানো পূর্ববর্তী অ্যাটাচমেন্ট তৈরির অনুরোধগুলো পরিবর্তন করুন।
- শিক্ষার্থীদের জমা দেওয়া বিষয়বস্তুর জন্য স্থায়ী সংরক্ষণ ব্যবস্থা চালু করুন।
- শিক্ষার্থীর ইনপুট গ্রহণ করার জন্য পূর্ববর্তী 'স্টুডেন্ট ভিউ' রুটটি পরিবর্তন করুন।
- স্টুডেন্ট ওয়ার্ক রিভিউ আইফ্রেমটি পরিবেশন করার জন্য একটি রুট প্রদান করুন।
কাজ শেষ হয়ে গেলে, শিক্ষক হিসেবে লগ ইন করে আপনি গুগল ক্লাসরুম UI-এর মাধ্যমে অ্যাসাইনমেন্টে অ্যাক্টিভিটি-ধরনের অ্যাটাচমেন্ট তৈরি করতে পারবেন। ক্লাসের শিক্ষার্থীরাও আইফ্রেমের মধ্যে অ্যাক্টিভিটিটি সম্পন্ন করে একটি প্রতিক্রিয়া জমা দিতে পারে। শিক্ষক ক্লাসরুম গ্রেডিং UI-তে শিক্ষার্থীর জমা দেওয়া কাজটি দেখতে পারেন।
এই উদাহরণের জন্য, পূর্ববর্তী ওয়াকথ্রু থেকে অ্যাটাচমেন্ট টেমপ্লেটটি পুনরায় ব্যবহার করুন, যেখানে একটি বিখ্যাত ল্যান্ডমার্কের ছবি এবং ল্যান্ডমার্কটির নামসহ একটি ক্যাপশন দেখানো হয়েছে। এই অ্যাক্টিভিটির কাজ হলো শিক্ষার্থীকে ল্যান্ডমার্কটির নাম বলতে বলা।
সংযুক্তি তৈরির অনুরোধ পরিবর্তন করুন
আপনার কোডের সেই অংশে যান যেখানে আপনি আগের ধাপে একটি কন্টেন্ট-টাইপ অ্যাটাচমেন্ট তৈরি করেছিলেন। এখানকার মূল জিনিসটি হলো একটি AddOnAttachment অবজেক্টের ইনস্ট্যান্স, যেখানে আমরা আগে অ্যাটাচমেন্টটির জন্য teacherViewUri , studentViewUri এবং title নির্দিষ্ট করেছিলাম।
যদিও সমস্ত অ্যাড-অন অ্যাটাচমেন্টের জন্য এই তিনটি ফিল্ড প্রয়োজন, studentWorkReviewUri এর উপস্থিতি বা অনুপস্থিতি নির্ধারণ করে যে অ্যাটাচমেন্টটি অ্যাক্টিভিটি-টাইপ নাকি কন্টেন্ট-টাইপ হবে। studentWorkReviewUri পূরণ করা একটি CREATE রিকোয়েস্ট অ্যাক্টিভিটি-টাইপ অ্যাটাচমেন্টে পরিণত হয়, অন্যদিকে studentWorkReviewUri ছাড়া একটি CREATE রিকোয়েস্ট কন্টেন্ট-টাইপ অ্যাটাচমেন্টে পরিণত হয়।
এই অনুরোধটিতে একমাত্র যে পরিবর্তনটি করতে হবে তা হলো studentWorkReviewUri ফিল্ডটি পূরণ করা। এখানে একটি উপযুক্ত নামের রাউট যোগ করুন; আপনি এটি পরবর্তী ধাপে বাস্তবায়ন করবেন।
পাইথন
আমাদের দেওয়া উদাহরণে, এটি webapp/attachment_routes.py ফাইলের create_attachments মেথডে রয়েছে।
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}",
}
কন্টেন্ট-টাইপ অ্যাটাচমেন্টের জন্য স্থায়ী স্টোরেজ যোগ করুন
আমাদের কার্যক্রমে শিক্ষার্থীর প্রতিক্রিয়াটি রেকর্ড করুন। শিক্ষক যখন 'Student Work Review' আইফ্রেমে জমা দেওয়া কাজটি দেখবেন, তখন আপনি এটি পরে দেখে নিতে পারবেন।
একটি Submission জন্য একটি ডাটাবেস স্কিমা সেট আপ করুন। আমাদের দেওয়া উদাহরণ অনুযায়ী, শিক্ষার্থীরা ছবিতে দেখানো ল্যান্ডমার্কের নাম লিখবে। সুতরাং, একটি Submission নিম্নলিখিত অ্যাট্রিবিউটগুলো থাকে:
-
attachment_id: একটি অ্যাটাচমেন্টের জন্য একটি অনন্য শনাক্তকারী। এটি Classroom দ্বারা নির্ধারিত হয় এবং অ্যাটাচমেন্ট তৈরি করার সময় রেসপন্সে ফেরত দেওয়া হয়। -
submission_id: শিক্ষার্থীর জমা দেওয়া তথ্যের একটি শনাক্তকারী। এটি Classroom দ্বারা নির্ধারিত হয় এবং Student View-এরgetAddOnContextরেসপন্সে ফেরত দেওয়া হয়।
-
student_response: শিক্ষার্থীর দেওয়া উত্তর।
পাইথন
পূর্ববর্তী ধাপগুলো থেকে 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 ফিল্ডে এই রুটটি নির্দিষ্ট করা থাকে। প্রথম যে পরিবর্তনটি করতে হবে তা হলো getAddOnContext রেসপন্স থেকে submissionId বের করে নেওয়া।
পাইথন
আমাদের দেওয়া উদাহরণে, এটি webapp/attachment_routes.py ফাইলের load_activity_attachment মেথডে রয়েছে।
# 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 ভ্যালু থাকে, যা ফাইলের অবস্থা নির্দেশ করে, যেমন শিক্ষার্থী ফাইলটি খুলেছে নাকি জমা দিয়েছে। এটি তখন কাজে আসতে পারে যখন আপনি জমা দেওয়া ফাইলে কোনো সম্পাদনার সুযোগ বন্ধ করতে চান, অথবা শিক্ষকদেরকে তাদের শিক্ষার্থীদের অগ্রগতি সম্পর্কে ধারণা দিতে আগ্রহী হন।
পাইথন
আমাদের দেওয়া উদাহরণে, এটি উপরের 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()
অবশেষে, আমাদের ডাটাবেস থেকে অ্যাটাচমেন্টের তথ্য সংগ্রহ করুন এবং একটি ইনপুট ফর্ম পরিবেশন করুন। আমাদের দেওয়া উদাহরণের ফর্মটিতে একটি স্ট্রিং ইনপুট ফিল্ড এবং একটি সাবমিট বাটন রয়েছে। ল্যান্ডমার্কের ছবিটি দেখান এবং শিক্ষার্থীকে এর নাম লিখতে বলুন। তারা উত্তর দিলে, তা আমাদের ডাটাবেসে রেকর্ড করুন।
পাইথন
আমাদের দেওয়া উদাহরণে, এটি উপরের 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)
ব্যবহারকারীদের মধ্যে পার্থক্য করার জন্য, সাবমিট ফাংশনটি নিষ্ক্রিয় করে তার পরিবর্তে টিচার ভিউতে সঠিক উত্তরটি দেখানোর বিষয়টি বিবেচনা করতে পারেন।
স্টুডেন্ট ওয়ার্ক রিভিউ আইফ্রেমের জন্য একটি রুট যোগ করুন
সবশেষে, স্টুডেন্ট ওয়ার্ক রিভিউ আইফ্রেমটি পরিবেশন করার জন্য একটি রুট যোগ করুন। এই রুটের নামটি অ্যাটাচমেন্ট তৈরি করার সময় studentWorkReviewUri এর জন্য দেওয়া নামের সাথে মিলতে হবে। শিক্ষক যখন ক্লাসরুম গ্রেডার UI-তে শিক্ষার্থীর জমা দেওয়া কাজটি দেখেন, তখন এই রুটটি খোলে।
Classroom যখন Student Work Review iframe-টি খোলে, তখন আপনি submissionId কোয়েরি প্যারামিটারটি পান। আপনার লোকাল ডেটাবেস থেকে শিক্ষার্থীর কাজ পুনরুদ্ধার করতে এটি ব্যবহার করুন:
পাইথন
আমাদের দেওয়া উদাহরণে, এটি 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)
অ্যাড-অনটি পরীক্ষা করুন
পূর্ববর্তী ওয়াকথ্রু থেকে অ্যাড-অন পরীক্ষা করার ধাপগুলো পুনরাবৃত্তি করুন। আপনার কাছে একটি অ্যাটাচমেন্ট থাকা উচিত যা শিক্ষার্থী খুলতে পারবে।
অ্যাক্টিভিটি অ্যাটাচমেন্টটি পরীক্ষা করতে নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:
- শিক্ষক পরীক্ষামূলক ব্যবহারকারীর একই ক্লাসে থাকা আপনার একজন ছাত্র পরীক্ষামূলক ব্যবহারকারী হিসেবে গুগল ক্লাসরুমে সাইন ইন করুন।
- Classwork ট্যাবে যান এবং test Assignment- টি প্রসারিত করুন।
- স্টুডেন্ট ভিউ খুলতে এবং অ্যাক্টিভিটিটির জন্য একটি প্রতিক্রিয়া জমা দিতে অ্যাড-অন অ্যাটাচমেন্ট কার্ডটিতে ক্লিক করুন।
- কাজটি সম্পন্ন করার পর আইফ্রেমটি বন্ধ করুন। ঐচ্ছিকভাবে, ‘Turn In’ বোতামটি ক্লিক করুন।
অ্যাক্টিভিটিটি সম্পন্ন করার পর ক্লাসরুমে কোনো পরিবর্তন দেখতে পাবেন না। এখন স্টুডেন্ট ওয়ার্ক রিভিউ আইফ্রেমটি পরীক্ষা করুন:
- শিক্ষক পরীক্ষা ব্যবহারকারী হিসেবে ক্লাসরুমে সাইন ইন করুন।
- গ্রেডস ট্যাবে আপনার টেস্ট অ্যাসাইনমেন্টের কলামটি খুঁজুন। আপনার টেস্ট অ্যাসাইনমেন্টের নামে ক্লিক করুন।
- পরীক্ষাধীন শিক্ষার্থী ব্যবহারকারীর কার্ডটি খুঁজুন। কার্ডের ওপর থাকা অ্যাটাচমেন্টটিতে ক্লিক করুন।
শিক্ষার্থীর জন্য সঠিক জমা দেওয়া তথ্য প্রদর্শিত হচ্ছে কিনা তা নিশ্চিত করুন।
অভিনন্দন! আপনি এখন পরবর্তী ধাপে যাওয়ার জন্য প্রস্তুত: অ্যাটাচমেন্ট গ্রেডগুলো সিঙ্ক করা ।