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

هذه هي الجولة التفصيلية السادسة ضمن السلسلة التفصيلية لإضافات 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)

الرجوع إلى طلب CREATE الخاص بـ courses.courseWork.addOnAttachments تخزين قيمة 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 للحصول على المعلّمين الحاليين. بعد ذلك، استعلام عن سجلات المستخدم المحلية لتحديد بيانات اعتماد المعلم المطابقة.
  • عند إنشاء مرفق إضافة، عليك تخزين معرّف المعلِّم في قاعدة بيانات المرفقات المحلية. بعد ذلك، يمكنك استرداد بيانات اعتماد المعلّم من 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,
    discoveryServiceUrl=f"https://classroom.googleapis.com/$discovery/rest?labels=ADD_ONS_ALPHA&key={GOOGLE_API_KEY}",
    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 لمراجعة عمل الطلاب، من المفترض أن تظهر الدرجة في مربّع "الدرجة" بعد تحميل إطار iframe مباشرةً. وكما ذكرنا أعلاه، يمكن أن يستغرق ذلك مدة تصل إلى 30 ثانية. بعد ذلك، يجب أن تظهر الدرجة للطالب المحدّد أيضًا في طرق العرض الأخرى لدفتر العلامات في Classroom.

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

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