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

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

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

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

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

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

  • عدِّل طلبات إنشاء المرفقات السابقة إلى واجهة برمجة التطبيقات Classroom API لضبط القاسم الخاص بدرجة المرفق أيضًا.
  • احتساب الدرجات آليًا للمادة التي أرسلها الطالب وضبط القاسم المُركّب لعلامة المرفق
  • يمكنك تنفيذ طريقتَين لإرسال درجة الإرسال إلى 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 الذي تم تمريره إلى إطار iframe في "عرض الطالب".attachmentId

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

أضِف حقلًا لتعريف المعلّم إلى جدول 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 الخاص بمراجعة عمل الطالب. يمكنك أيضًا الاطّلاع عليها في قائمة الطلاب عند فتح المَهمّة الدراسية، وفي مربّع "الدرجة" بجانب الإطار المتداخل لمراجعة "عمل الطالب".
  • إذا اخترت إعادة إرسال درجة عندما يفتح المعلّم الإطار المتداخل "مراجعة أعمال الطلاب"، من المفترض أن تظهر الدرجة في مربّع "الدرجة" بعد تحميل الإطار المتداخل بوقت قصير. كما سبق ذكره، قد يستغرق ذلك مدة تصل إلى 30 ثانية. بعد ذلك، من المفترض أن تظهر الدرجة للطالب المحدّد أيضًا في طرق العرض الأخرى لدفتر العلامات في Classroom.

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

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