علامات المرفقات ودرجات التراجع عن الظهور

هذه هي الجولةالسادسة في سلسلة جولاتنا التفصيلية حول إضافات Classroom.

في هذه الجولة الإرشادية، ستُعدِّل المثال من خطوة الجولة الإرشادية السابقة لإنشاء مرفق من النوع نشاط مُقيَّم. يمكنك أيضًا إرسال درجة مرة أخرى إلى Google Classroom آليًا، وستظهر في دفتر علامات المعلّم كمسودة درجة.

يختلف هذا الدليل التفصيلي قليلاً عن الأدلة الأخرى في السلسلة لأنّه يقدّم طريقتَين محتملتَين لإرسال الدرجات إلى Classroom. ولكل منهما تأثيرات مختلفة على تجربتَي المطوّر والمستخدم، لذا يجب مراعاة كليهما عند تصميم إضافة Classroom. يمكنك الاطّلاع على صفحة دليل التفاعل مع المرفقات لمناقشة إضافية حول خيارات التنفيذ.

يُرجى العلم أنّ ميزات التقييم في واجهة برمجة التطبيقات اختيارية. ويمكن استخدامها مع أي مرفق من النوع "نشاط".

خلال هذه الجولة الإرشادية، عليك إكمال ما يلي:

  • عدِّل طلبات إنشاء المرفقات السابقة في واجهة برمجة تطبيقات Classroom لضبط القاسم الخاص بدرجة المرفق أيضًا.
  • احتساب الدرجات التي حصل عليها الطالب بشكل آلي وضبط القيمة الكسرية لتقييم المرفق
  • يمكنك تنفيذ طريقتَين لنقل درجة العينة المرسَلة إلى Classroom باستخدام بيانات اعتماد المعلّم التي تم تسجيل الدخول إليها أو بيانات الاعتماد بلا إنترنت.

بعد الانتهاء، تظهر الدرجات في دفتر العلامات في Classroom بعد بدء سلوك إعادة التوجيه. تعتمد اللحظة الدقيقة التي يحدث فيها ذلك على نهج التنفيذ.

لأغراض هذا المثال، أعِد استخدام النشاط من الشرح السابق، والذي يتم فيه عرض صورة لمعلم شهير على الطالب ويُطلَب منه إدخال اسمه. امنح العلامات الكاملة للمرفق إذا أدخل الطالب الاسم الصحيح، وصفرًا في حال عدم إدخاله.

التعرّف على ميزة وضع الدرجات في واجهة برمجة التطبيقات الخاصة بإضافات Classroom

يمكن أن تضبط الإضافة كلاً من البسط والمقام للدرجة المتعلّقة بملف ملتصق. يتم ضبط هذه القيم على التوالي باستخدام قيمتَي pointsEarned وmaxPoints في واجهة برمجة التطبيقات. تعرض بطاقة المرفق في واجهة مستخدم Classroom قيمةmaxPoints عند ضبطها.

مثال على مرفقات متعددة بقيمة maxPoints في مهمة واحدة

الشكل 1: واجهة مستخدم إنشاء المهام تتضمّن ثلاث بطاقات مرفقات إضافية تم ضبطها على maxPoints

تتيح لك واجهة برمجة تطبيقات إضافات Classroom ضبط الإعدادات وتحديد النتيجة التي حصل عليها الطلاب لدرجات المرفقات. وهذه الدرجات ليست مماثلة لدرجات المهام الدراسية. ومع ذلك، تتّبع إعدادات الدرجات في المهمة إعدادات الدرجات للمرفق الذي يحمل تصنيف مزامنة الدرجات في بطاقة المرفق. عندما يضبط مرفق "مزامنة العلامات" القيمة pointsEarned لملف تم إرساله من قِبل الطالب، يتم أيضًا ضبط درجة مسودة الطالب للمهمة.

عادةً ما يتلقّى المرفق الأول الذي تمت إضافته إلى المهمة التي تضبط maxPoints تصنيف "مزامنة الدرجات". اطّلِع على واجهة المستخدم لإنشاء المهام الدراسية المثال الموضّح في الشكل 1 للحصول على مثال على تصنيف "مزامنة الدرجات". يُرجى العلم أنّه تحتوي بطاقة "المرفق 1" على تصنيف "مزامنة الدرجات" وأنّه تم تعديل درجة الواجب الدراسي في المربّع الأحمر إلى 50 نقطة. يُرجى العلم أيضًا أنّه على الرغم من أنّ الشكل 1 يعرض ثلاث بطاقات مرفقات، إلا أنّ بطاقة واحدة فقط تحمل تصنيف "مزامنة الدرجات". يشكّل ذلك أحد القيود الرئيسية لعملية التنفيذ الحالية: يمكن أن يتضمّن مرفق واحد فقط تصنيف "مزامنة الدرجات".

إذا كانت هناك عدة مرفقات تم ضبطها على maxPoints، لا يؤدي إزالة المرفق الذي تم ضبطه على "مزامنة الدرجات" إلى تفعيل "مزامنة الدرجات" على أي من المرفقات المتبقية. يؤدي إضافة مرفق آخر يضبط maxPoints إلى تفعيل مزامنة الدرجات في المرفق الجديد، ويتم تعديل الحد الأقصى لدرجة المهمة لتصبح مماثلة. لا تتوفّر آلية لمعرفة المرفق الذي يحمل تصنيف "مزامنة الدرجات" أو معرفة عدد المرفقات في مهمة معيّنة بشكل آلي.

ضبط الحد الأقصى للدرجة المسموح بها للمرفق

يوضّح هذا القسم كيفية ضبط المقام لتقييم مرفق، أي الحد الأقصى للنتيجة التي يمكن لجميع الطلاب تحقيقها في نماذجهم المرسَلة. لإجراء ذلك، اضبط قيمة maxPoints للمرفق.

ما عليك سوى إجراء تعديل بسيط على عملية التنفيذ الحالية لتفعيل ميزات التقييم. عند إنشاء مرفق، أضِف القيمة maxPoints في عنصرAddOnAttachment نفسه الذي يحتوي على studentWorkReviewUri و teacherViewUri وحقول المرفقات الأخرى.

يُرجى العِلم أنّ الحد الأقصى التلقائي للنتيجة في مهمة جديدة هو 100. نقترح ضبط maxPoints على قيمة غير 100 حتى تتمكّن من التأكّد من أنّه يتم ضبط الدرجات بشكل صحيح. اضبط maxPoints على 50 لعرض مثال:

Python

أضِف الحقل maxPoints عند إنشاء عنصر attachment، مباشرةً قبل إصدار طلب CREATE إلى نقطة نهاية courses.courseWork.addOnAttachments. يمكنك العثور على هذا في ملف 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.
    "studentWorkReviewUri": {
        "uri":
            flask.url_for(
                "view_submission", _scheme='https', _external=True)
    },
    # Sets the maximum points that a student can earn for this activity.
    # This is the denominator in a fractional representation of a grade.
    "maxPoints": 50,
    # The title of the attachment.
    "title": f"Attachment {attachment_count}",
}

لأغراض هذا العرض التوضيحي، يمكنك أيضًا تخزين القيمة maxPoints في قاعدة بيانات "المرفقات" المحلية، ما يجنبك الحاجة إلى إجراء طلب إضافي لواجهة برمجة التطبيقات لاحقًا عند تقييم المحتوى الذي يرسله الطلاب. يُرجى العلم أنّه من الممكن أن يغيّر المعلّمون إعدادات الدرجات في المهام بشكل مستقل عن إضافتك. أرسِل طلب GET إلى نقطة النهاية courses.courseWork للاطّلاع على قيمةmaxPoints على مستوى المهمة. عند إجراء ذلك، أرسِل الرمز itemId في حقل CourseWork.id.

عدِّل الآن نموذج قاعدة البيانات ليحتوِى أيضًا على قيمة maxPoints للمرفق. ننصحك باستخدام قيمة maxPoints من استجابة CREATE:

Python

أولاً، أضِف حقل max_points إلى جدول Attachment. يمكنك العثور على هذه القيمة في ملف webapp/models.py إذا اتّبعت المثال المقدَّم.

# Database model to represent an attachment.
class Attachment(db.Model):
    # The attachmentId is the unique identifier for the attachment.
    attachment_id = db.Column(db.String(120), primary_key=True)

    # The image filename to store.
    image_filename = db.Column(db.String(120))

    # The image caption to store.
    image_caption = db.Column(db.String(120))

    # The maximum number of points for this activity.
    max_points = db.Column(db.Integer)

ارجع إلى طلب courses.courseWork.addOnAttachments CREATE. تخزين قيمةmaxPoints التي تم إرجاعها في الاستجابة

new_attachment = Attachment(
    # The new attachment's unique ID, returned in the CREATE response.
    attachment_id=resp.get("id"),
    image_filename=key,
    image_caption=value,
    # Store the maxPoints value returned in the response.
    max_points=int(resp.get("maxPoints")))
db.session.add(new_attachment)
db.session.commit()

أصبح للمرفق الآن الحد الأقصى من الدرجات. من المفترض أن تتمكّن من اختبار هذا السلوك الآن. أضِف مرفقًا إلى مهمة جديدة، ولاحظ أنّ بطاقة المرفق تعرض تصنيف "مزامنة الدرجات" وتتغيّر قيمة "النقاط" للمهمة.

ضبط درجة لإرسال الطلاب في Classroom

يصف هذا القسم كيفية ضبط المرّة لدرجة مرفق، أي نتيجة الطالب الفردي للمرفق. لإجراء ذلك، اضبط قيمة pointsEarned لمشاركة أحد الطلاب.

عليك الآن اتخاذ قرار مهم: كيف يجب أن تُصدر الإضافة طلبًا لضبط pointsEarned؟

تكمن المشكلة في أنّ ضبط pointsEarned يتطلب نطاق OAuth teacher. يجب عدم منح نطاق teacher للمستخدمين من الطلاب، لأنّ ذلك قد يؤدي إلى سلوك غير متوقّع عندما يتفاعل الطلاب مع الإضافة، مثل تحميل ملف iframe لعرض المعلم بدلاً من ملف iframe لعرض الطالب. وبالتالي، لديك خياران لتحديد pointsEarned:

  • باستخدام بيانات اعتماد المعلّم الذي سجّل الدخول
  • استخدام بيانات اعتماد المعلّم المخزّنة (بلا إنترنت)

تتناول الأقسام التالية المفاضلات بين كل نهج قبل توضيح كل عملية تنفيذ. يُرجى العِلم أنّ الأمثلة المقدَّمة توضّح كلا النهجَين لنقل الدرجات إلى Classroom. يُرجى الاطّلاع على التعليمات الخاصة باللغة أدناه لمعرفة كيفية اختيار نهج عند تنفيذ الأمثلة المقدَّمة:

Python

ابحث عن بيان SET_GRADE_WITH_LOGGED_IN_USER_CREDENTIALS في أعلى ملف webapp/attachment_routes.py. اضبط هذه القيمة على True لإرسال الدرجات باستخدام بيانات اعتماد المعلّم الذي سجّل الدخول. اضبط هذه القيمة على False لإرسال الدرجات باستخدام بيانات الاعتماد المخزّنة عندما يرسل الطالب النشاط.

ضبط الدرجات باستخدام بيانات اعتماد المعلّم الذي سجّل الدخول

استخدِم بيانات اعتماد المستخدم الذي سجّل الدخول لإصدار طلب ضبط pointsEarned. من المفترض أن يكون هذا الإجراء بسيطًا جدًا لأنّه يعكس بقية عملية التنفيذ حتى الآن، ولا يتطلّب سوى القليل من الجهد.

يُرجى العِلم أنّ المعلّم يتفاعل فقط مع العينة التي أرسلها الطالب في إطار iframe الخاص بمراجعة عمل الطالب. لهذا الإجراء بعض التأثيرات العميقة:

  • لا يتمّ تعبئة أيّ درجات في Classroom إلى أن يتّخذ المعلّم إجراءً في واجهة مستخدم Classroom.
  • قد يحتاج المعلّم إلى فتح كلّ مهمة أرسلها الطالب من أجل تعبئة كل درجات الطلاب.
  • هناك تأخير قصير بين تلقّي Classroom للدرجة وظهورها في واجهة مستخدم Classroom. تبلغ مدّة التأخير عادةً من خمس إلى عشر ثوانٍ، ولكن يمكن أن تصل إلى 30 ثانية.

ويؤدي الجمع بين هذه العوامل إلى أنّه قد على المعلّمين تنفيذ عمل يدوي كبير يستغرق وقتًا طويلاً لملء درجات الصف بالكامل.

لتنفيذ هذا النهج، أضِف طلب بيانات آخر من واجهة برمجة التطبيقات إلى مسار "مراجعة أعمال الطلاب" الحالي.

بعد جلب سجلّات الإرسال والمرفقات التي أرسلها الطالب، قيِّم الملف الذي أرسله الطالب واحفظ الدرجة الناتجة. اضبط الدرجة في حقل pointsEarned لكائن AddOnAttachmentStudentSubmission. أخيرًا، أرسِل طلب PATCH إلى نقطة نهاية courses.courseWork.addOnAttachments.studentSubmissions مع مثيل AddOnAttachmentStudentSubmission في نص الطلب. يُرجى العلم أنّنا نحتاج أيضًا إلى تحديد pointsEarned في updateMask في طلب PATCH:

Python

# 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)

grade = 0

# See if the student response matches the stored name.
if student_submission.student_response.lower(
) == attachment.image_caption.lower():
    grade = attachment.max_points

# Create an instance of the Classroom service.
classroom_service = ch._credential_handler.get_classroom_service()

# Build an AddOnAttachmentStudentSubmission instance.
add_on_attachment_student_submission = {
    # Specifies the student's score for this attachment.
    "pointsEarned": grade,
}

# Issue a PATCH request to set the grade numerator for this attachment.
patch_grade_response = classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().patch(
    courseId=flask.session["courseId"],
    itemId=flask.session["itemId"],
    attachmentId=flask.session["attachmentId"],
    submissionId=flask.session["submissionId"],
    # updateMask is a list of fields being modified.
    updateMask="pointsEarned",
    body=add_on_attachment_student_submission).execute()

ضبط الدرجات باستخدام بيانات اعتماد المعلّم بلا إنترنت

تتطلّب الطريقة الثانية لضبط الدرجات استخدام بيانات الاعتماد المخزّنة للمعلّم الذي أنشأ المرفق. يتطلّب هذا التنفيذ إنشاء بيانات اعتماد باستخدام رمزَي إعادة تحميل ووصول مُعلّم مفوَّض سابقًا، ثم استخدام بيانات الاعتماد هذه لضبط pointsEarned.

من المزايا المهمة لهذا النهج أنّه يتم تعبئة الدرجات بدون الحاجة إلى إجراء من المعلّم في واجهة مستخدم Classroom، ما يتجنّب المشاكل المذكورة أعلاه. والنتيجة هي أنّ المستخدمين النهائيين يرون أنّ تجربة وضع الدرجات سلسة وفعّالة. بالإضافة إلى ذلك، يتيح لك هذا النهج اختيار الوقت الذي تُرسِل فيه الدرجات، مثل عندما يُكمل الطلاب النشاط أو بشكل غير متزامن.

أكمِل المهام التالية لتنفيذ هذا النهج:

  1. عدِّل سجلات قاعدة بيانات المستخدمين لتخزين رمز دخول إلى التطبيق.
  2. عدِّل سجلات قاعدة بيانات "المرفقات" لتخزين رقم تعريف المعلّم.
  3. استرداد بيانات اعتماد المعلّم وإنشاء مثيل جديد (اختياري) للخدمة Classroom
  4. اضبط درجة العينة التي تم إرسالها.

لأغراض هذا العرض التوضيحي، اضبط العلامة عندما يُكمل الطالب النشاط، أي عندما يُرسل الطالب النموذج في مسار "عرض الطالب" .

تعديل سجلّات قاعدة بيانات المستخدمين لتخزين رمز الوصول

يجب توفُّر رمزَين مميّزَين فريدَين لإجراء طلبات بيانات من واجهة برمجة التطبيقات، وهما رمز إعادة التنشيط ورمز الدخول. إذا كنت قد اطّلعت على سلسلة الخطوات الإرشادية حتى الآن، من المفترض أن يكون مخطّط جدول User قد سجّل رمز إعادة التنشيط. يكفي تخزين رمز إعادة التحديث عند إجراء طلبات بيانات من واجهة برمجة التطبيقات باستخدام المستخدم الذي سجّل الدخول فقط، لأنّه ستتلقّى رمز مرور كجزء من عملية المصادقة.

ومع ذلك، عليك الآن إجراء المكالمات باسم مستخدم آخر غير المستخدم الذي سجّل الدخول، ما يعني أنّ عملية المصادقة غير متاحة. وبالتالي، عليك تخزين رمز المرور للوصول إلى جانب رمز المرور لإعادة التحميل. عدِّل مخطّط جدول User لإضافة رمز دخول:

Python

في المثال الذي قدّمناه، يمكنك العثور على هذا العنصر في ملف webapp/models.py.

# Database model to represent a user.
class User(db.Model):
    # The user's identifying information:
    id = db.Column(db.String(120), primary_key=True)
    display_name = db.Column(db.String(80))
    email = db.Column(db.String(120), unique=True)
    portrait_url = db.Column(db.Text())

    # The user's refresh token, which will be used to obtain an access token.
    # Note that refresh tokens will become invalid if:
    # - The refresh token has not been used for six months.
    # - The user revokes your app's access permissions.
    # - The user changes passwords.
    # - The user belongs to a Google Cloud organization
    #   that has session control policies in effect.
    refresh_token = db.Column(db.Text())

    # An access token for this user.
    access_token = db.Column(db.Text())

بعد ذلك، عدِّل أي رمز ينشئ سجلّ User أو يعدّله لتخزين رمز المرور العميق أيضًا:

Python

في المثال الذي قدّمناه، يمكنك العثور على هذا العنصر في ملف webapp/credential_handler.py.

def save_credentials_to_storage(self, credentials):
    # Issue a request for the user's profile details.
    user_info_service = googleapiclient.discovery.build(
        serviceName="oauth2", version="v2", credentials=credentials)
    user_info = user_info_service.userinfo().get().execute()
    flask.session["username"] = user_info.get("name")
    flask.session["login_hint"] = user_info.get("id")

    # See if we have any stored credentials for this user. If they have used
    # the add-on before, we should have received login_hint in the query
    # parameters.
    existing_user = self.get_credentials_from_storage(user_info.get("id"))

    # If we do have stored credentials, update the database.
    if existing_user:
        if user_info:
            existing_user.id = user_info.get("id")
            existing_user.display_name = user_info.get("name")
            existing_user.email = user_info.get("email")
            existing_user.portrait_url = user_info.get("picture")

        if credentials and credentials.refresh_token is not None:
            existing_user.refresh_token = credentials.refresh_token
            # Update the access token.
            existing_user.access_token = credentials.token

    # If not, this must be a new user, so add a new entry to the database.
    else:
        new_user = User(
            id=user_info.get("id"),
            display_name=user_info.get("name"),
            email=user_info.get("email"),
            portrait_url=user_info.get("picture"),
            refresh_token=credentials.refresh_token,
            # Store the access token as well.
            access_token=credentials.token)

        db.session.add(new_user)

    db.session.commit()

تعديل سجلات قاعدة بيانات "المرفقات" لتخزين رقم تعريف المعلّم

لتحديد درجة لنشاط، عليك إجراء مكالمة لضبط pointsEarned كمعلّم في الدورة التدريبية. هناك عدة طرق لإجراء ذلك:

  • تخزين تعيين محلي لبيانات اعتماد المعلّمين مع أرقام تعريف الدورات التدريبية يُرجى العلم أنّه قد لا يكون المعلّم نفسه مرتبطًا دائمًا بدورة تدريبية معيّنة.
  • أرسِل GET طلبًا إلى نقطة نهاية courses في Classroom API لجمع المعلّمين الحاليين. بعد ذلك، يمكنك البحث في سجلات المستخدمين المحليين لتحديد مكان بيانات اعتماد المعلّم المطابقة.
  • عند إنشاء مرفق إضافي، يمكنك تخزين معرّف المعلّم في قاعدة بيانات المرفقات المحلية. بعد ذلك، استرجع بيانات اعتماد المعلّم من ملف cgi-bin attachmentId الذي تم تمريره إلى إطار iframe في "عرض الطالب".

يوضّح هذا المثال الخيار الأخير لأنّك تضبط الدرجات عندما يُكمِل الطالب مرفق النشاط.

أضِف حقلًا لتعريف المعلّم إلى جدول Attachment في قاعدة بياناتك:

Python

في المثال الذي قدّمناه، يمكنك العثور على هذا العنصر في ملف webapp/models.py.

# Database model to represent an attachment.
class Attachment(db.Model):
    # The attachmentId is the unique identifier for the attachment.
    attachment_id = db.Column(db.String(120), primary_key=True)

    # The image filename to store.
    image_filename = db.Column(db.String(120))

    # The image caption to store.
    image_caption = db.Column(db.String(120))

    # The maximum number of points for this activity.
    max_points = db.Column(db.Integer)

    # The ID of the teacher that created the attachment.
    teacher_id = db.Column(db.String(120))

بعد ذلك، عدِّل أي رمز برمجي ينشئ سجلّ Attachment أو يعدّله لتخزين رقم تعريف صانع المحتوى أيضًا:

Python

في المثال الذي قدّمناه، يمكنك العثور على هذا الإجراء في طريقة create_attachments في ملف webapp/attachment_routes.py.

# Store the attachment by id.
new_attachment = Attachment(
    # The new attachment's unique ID, returned in the CREATE response.
    attachment_id=resp.get("id"),
    image_filename=key,
    image_caption=value,
    max_points=int(resp.get("maxPoints")),
    teacher_id=flask.session["login_hint"])
db.session.add(new_attachment)
db.session.commit()

استرداد بيانات اعتماد المعلّم

ابحث عن المسار الذي يعرض إطار iframe في "عرض الطالب". بعد تخزين ردّ الطالب في قاعدة البيانات المحلية مباشرةً، استردّ بيانات اعتماد المعلّم من مساحة التخزين المحلية. من المفترض أن تكون هذه العملية سهلة نظرًا لخطوات الإعداد التي تم إجراؤها في الخطوتَين السابقتَين. يمكنك أيضًا استخدام هذه العناصر لإنشاء مثيل جديد لخدمة Classroom للمستخدم المعلّم:

Python

في المثال الذي قدّمناه، يمكنك العثور على هذا الإجراء في load_activity_attachment في ملف webapp/attachment_routes.py.

# Create an instance of the Classroom service using the tokens for the
# teacher that created the attachment.

# We're assuming that there are already credentials in the session, which
# should be true given that we are adding this within the Student View
# route; we must have had valid credentials for the student to reach this
# point. The student credentials will be valid to construct a Classroom
# service for another user except for the tokens.
if not flask.session.get("credentials"):
    raise ValueError(
        "No credentials found in session for the requested user.")

# Make a copy of the student credentials so we don't modify the original.
teacher_credentials_dict = deepcopy(flask.session.get("credentials"))

# Retrieve the requested user's stored record.
teacher_record = User.query.get(attachment.teacher_id)

# Apply the user's tokens to the copied credentials.
teacher_credentials_dict["refresh_token"] = teacher_record.refresh_token
teacher_credentials_dict["token"] = teacher_record.access_token

# Construct a temporary credentials object.
teacher_credentials = google.oauth2.credentials.Credentials(
    **teacher_credentials_dict)

# Refresh the credentials if necessary; we don't know when this teacher last
# made a call.
if teacher_credentials.expired:
    teacher_credentials.refresh(Request())

# Request the Classroom service for the specified user.
teacher_classroom_service = googleapiclient.discovery.build(
    serviceName=CLASSROOM_API_SERVICE_NAME,
    version=CLASSROOM_API_VERSION,
    credentials=teacher_credentials)

ضبط درجة العينة المرسَلة

من هنا فصاعدًا، تكون الإجراءات متطابقة مع تلك المتّبعة في استخدام ملف اعتماد المعلّم الذي سجّل الدخول. يُرجى العِلم أنّه عليك إجراء المكالمة باستخدام ملف ملف تعريف المعلم الذي تم استرجاعه في الخطوة السابقة:

Python

# Issue a PATCH request as the teacher to set the grade numerator for this
# attachment.
patch_grade_response = teacher_classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().patch(
    courseId=flask.session["courseId"],
    itemId=flask.session["itemId"],
    attachmentId=flask.session["attachmentId"],
    submissionId=flask.session["submissionId"],
    # updateMask is a list of fields being modified.
    updateMask="pointsEarned",
    body=add_on_attachment_student_submission).execute()

اختبار الإضافة

على غرار الشرح السابق، أنشئ مهمة دراسية تتضمّن مرفقًا من النوع "نشاط" بصفتك معلّمًا، وأرسِل ردًا بصفتك طالبًا، ثم افتح الردّ الذي أرسله في إطار iframe الخاص بمراجعة أعمال الطلاب. من المفترض أن يظهر لك التقييم في أوقات مختلفة حسب نهج التنفيذ الذي تتّبعه:

  • إذا اخترت إرسال درجة عندما أكمل الطالب النشاط، من المفترض أن تظهر لك درجة المسودة في واجهة المستخدم قبل فتح ملف iframe الخاص بمراجعة عمل الطالب. يمكنك أيضًا الاطّلاع عليها في قائمة الطلاب عند فتح المهمة الدراسية، وفي مربّع "الدرجة" بجانب الإطار المتداخل لمراجعة عمل الطالب.
  • إذا اخترت إعادة إرسال درجة عندما يفتح المعلّم إطار iframe الخاص بمراجعة عمل الطالب، من المفترض أن تظهر الدرجة في مربّع "الدرجة" بعد تحميل إطار iframe بوقت قصير. كما سبق ذكره، قد يستغرق ذلك مدة تصل إلى 30 ثانية. بعد ذلك، من المفترض أن تظهر الدرجة للطالب المحدّد أيضًا في طرق العرض الأخرى لدفتر العلامات في Classroom.

تأكَّد من ظهور النتيجة الصحيحة للطالب.

تهانينا! يمكنك الآن الانتقال إلى الخطوة التالية: إنشاء مرفقات خارج Google Classroom.