إدارة فترات وضع الدرجات باستخدام Classroom API

يوضّح هذا الدليل كيفية استخدام نقاط نهاية فترات التقييم في Google Classroom API.

نظرة عامة

يتم إنشاء فترات وضع الدرجات لتنظيم الواجبات المنزلية والاختبارات والمشاريع في نطاقات زمنية محدّدة. تتيح Classroom API للمطوّرين قراءة فترات وضع الدرجات في Classroom وتعديلها وإنشاؤها بالنيابة عن المشرفين والمعلّمين. يمكنك أيضًا استخدام Classroom API لتحديد فترات التقييم في CourseWork.

تقدّم Classroom API نقطتَي نهاية لقراءة معلومات فترة التقييم وكتابتها في دورة تدريبية:

  • GetGradingPeriodSettings: يتيح لك الاطّلاع على إعدادات فترة وضع الدرجات في أحد الدورات الدراسية.
  • UpdateGradingPeriodSettings: يتيح لك إدارة إعدادات فترات وضع الدرجات في أحد البكالوريوس من خلال إضافة فترات وضع الدرجات وتعديلها وحذفها، وتطبيق فترات وضع الدرجات التي تم ضبطها على جميع أعمال الدورة التدريبية الحالية.

متطلبات الترخيص والأهلية

تعديل إعدادات فترة وضع الدرجات في دورة تدريبية

لإنشاء فترات التقييم أو تعديلها أو حذفها في دورة تدريبية باستخدام نقطة النهاية UpdateGradingPeriodSettings، يجب استيفاء الشروط التالية:

  • يجب أن يكون المستخدم الذي يقدّم الطلب معلّمًا في الدورة الدراسية أو مشرفًا.
  • أن يكون لدى المستخدم الذي يقدّم الطلب ترخيص Google Workspace for Education Plus ممنوح له
  • أن يكون لدى مالك الدورة التدريبية ترخيص Google Workspace for Education Plus

قراءة إعدادات فترة وضع الدرجات في دورة دراسية

يمكن لمشرفي النطاقات ومعلّمي الدورات التدريبية قراءة إعدادات ملف تقييم الأداء بغض النظر عن الترخيص الذي تم منحه لهم. وهذا يعني أنّه يُسمح بطلبات الوصول إلى نقطة نهاية GetGradingPeriodSettings نيابةً عن أي مشرف أو معلّم في النطاق.

ضبط رقم تعريف فترة وضع الدرجات في CourseWork

يمكن لمعلّمي الدورة التدريبية تضمين gradingPeriodId عند إنشاء أو تعديل CourseWork باستخدام واجهة برمجة التطبيقات بغض النظر عن الترخيص الذي تم منحه لهم.

التحقّق من أهلية مستخدم لإعداد فترات التقييم

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

المتطلبات الأساسية

يقدّم هذا الدليل أمثلة على الرموز البرمجية في Python، ويفترض أنّ لديك ما يلي:

  • مشروع على Google Cloud يمكنك إعداد بيئة تطوير باتّباع التعليمات الواردة في مقالة البدء السريع باستخدام Python.
  • إضافة النطاقات التالية إلى شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth في مشروعك:
    • https://www.googleapis.com/auth/classroom.courses
    • https://www.googleapis.com/auth/classroom.coursework.students
  • معرّف دورة تدريبية يجب تعديل فترات التقييم فيها. يجب أن يكون لدى مالك الدورة التدريبية ترخيص Google Workspace for Education Plus.
  • الوصول إلى بيانات اعتماد المعلّم أو المشرف باستخدام ترخيص Google Workspace for Education Plus ستحتاج إلى بيانات اعتماد معلّم لإنشاء "واجب دراسي" أو تعديله. لا يمكن للمشرفين إنشاء أو تعديل assignments إذا لم يكونوا معلّمين في الدورة التدريبية.

إدارة المورد GradingPeriodSettings

يتضمّن مورد GradingPeriodSettings قائمة بعناصر GradingPeriods فردية وحقلًا منطقيًا يُسمى applyToExistingCoursework.

تأكَّد من أنّ كل GradingPeriods فردي في القائمة يستوفي المتطلبات التالية:

  • العنوان وتاريخ البدء وتاريخ الانتهاء: يجب أن تحتوي كل فترة تقييم على عنوان و تاريخ بدء وتاريخ انتهاء.
  • عنوان فريد: يجب أن يكون لكل فترة وضع درجات عنوان فريد لا يتطابق مع أي فترات وضع درجات أخرى في الدورة التدريبية.
  • تواريخ غير متداخلة: يجب ألا يكون لكل فترة تقييم تاريخ بدء أو نهاية يتداخل مع أي فترات تقييم أخرى في الدورة التدريبية.
  • الترتيب الزمني: يجب إدراج فترات وضع الدرجات بالترتيب الزمني استنادًا إلى تاريخَي البدء والانتهاء.

سيتمّ منح كلّ فترة تقييم معرّفًا عند إنشائها من خلال واجهة برمجة التطبيقات Classroom API.

القيمة المنطقية applyToExistingCoursework هي إعداد دائم يتيح لك تنظيم "أعمال الدورة الدراسية" التي تم إنشاؤها سابقًا في فترات التقييم بدون الحاجة إلى إجراء طلب منفصل لواجهة برمجة التطبيقات لتعديل gradingPeriodId لكل "عمل دورة دراسية". إذا تم ضبطه على True، سيضبط Classroom تلقائيًاgradingPeriodId على جميع أعمال الدورة التدريبية الحالية إذا كانcourseWork.dueDate يقع ضمن تاريخَي بدء وانتهاء فترة وضع الدرجات الحالية. إذا لم يتم تحديد تاريخ استحقاق في "عمل الدورة الدراسية"، سيستخدم ClassroomcourseWork.scheduledTime. إذا لم يكن أيّ من الحقلين متوفّرًا أو لم يكن هناك تطابق بين تاريخَي البدء والانتهاء لفترة وضع الدرجات الحالية، لن يكون العمل الدراسي مرتبطًا بأيّ فترة وضع درجات.

تحديد ما إذا كان بإمكان المستخدم تعديل إعدادات فترة التقييم في مقرر دراسي

تقدّم واجهة برمجة التطبيقات Classroom API نقطة نهاية userProfiles.checkUserCapability لمساعدتك في تحديد ما إذا كان بإمكان المستخدم إرسال طلبات إلى نقطة نهاية UpdateGradingPeriodSettings بشكل استباقي.

Python

def check_grading_periods_update_capability(classroom_service, course_id):
    """Checks whether a user is able to create and modify grading periods in a course."""
    try:
        capability = classroom_service.userProfiles().checkUserCapability(
          userId="me",
          capability="UPDATE_GRADING_PERIOD_SETTINGS",
           # Required while the checkUserCapability method is available in the Developer Preview Program.
          previewVersion="V1_20240930_PREVIEW"
        ).execute()

        # Retrieve the `allowed` boolean from the response.
        if capability.get("allowed"):
          print("User is allowed to update grading period settings in the course.")
        else:
          print("User is not allowed to update grading period settings in the course.")
    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

إضافة فترات وضع الدرجات

بعد التأكّد من أنّ المستخدم مؤهّل لتعديل إعدادات فترة التقييم في دورة تدريبية، يمكنك بدء إرسال الطلبات إلى نقطة نهاية UpdateGradingPeriodSettings. يتم إجراء أي تعديلات على موارد GradingPeriodSettings باستخدام نقطة نهاية UpdateGradingPeriodSettings سواء كنت تضيف فترات تقييم individual أو تعدّل فترات تقييم حالية أو تحذف فترة تقييم.

Python

في المثال التالي، تم تعديل المورد gradingPeriodSettings لتضمين فترتين للتصنيف. يتم ضبط القيمة المنطقية applyToExistingCoursework على True، ما سيؤدّي إلى تعديل gradingPeriodId في أيّ ملف حالي CourseWork يقع بين تاريخَي بدء وانتهاء فترة وضع الدرجات. يُرجى العلم أنّ updateMask يتضمّن كلا الحقلين. احفظ معرّفات الفترات الفردية للتصحيح بعد عرضها في الردّ. ستحتاج إلى استخدام هذه الأرقام التعريفية لتعديل فترات وضع الدرجات إذا لزم الأمر.

def create_grading_periods(classroom_service, course_id):
    """
    Create grading periods in a course and apply the grading periods
    to existing courseWork.
    """
    try:
        body = {
          "gradingPeriods": [
            {
              "title": "First Semester",
              "start_date": {
                "day": 1,
                "month": 9,
                "year": 2023
              },
              "end_date": {
                "day": 15,
                "month": 12,
                "year": 2023
              }
            },
            {
              "title": "Second Semester",
              "start_date": {
                "day": 15,
                "month": 1,
                "year": 2024
              },
              "end_date": {
                "day": 31,
                "month": 5,
                "year": 2024
              }
            }
          ],
          "applyToExistingCoursework": True
        }
        gradingPeriodSettingsResponse = classroom_service.courses().updateGradingPeriodSettings(
          courseId=course_id,
          updateMask='gradingPeriods,applyToExistingCoursework',
          body=body
        ).execute();

        print(f"Grading period settings updated.")
        return gradingPeriodSettingsResponse

    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

قراءة إعدادات فترة وضع الدرجات

يتم قراءة GradingPeriodSettings باستخدام نقطة النهاية GetGradingPeriodSettings. يمكن لأي مستخدم، بغض النظر عن الترخيص، قراءة إعدادات فترات التقييم في دورة تدريبية.

Python

def get_grading_period_settings(classroom_service, course_id):
    """Read grading periods settings in a course."""
    try:
        gradingPeriodSettings = classroom_service.courses().getGradingPeriodSettings(
          courseId=course_id).execute()
        return gradingPeriodSettings
    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

إضافة فترة وضع درجات فردية إلى القائمة

يجب إجراء التعديلات على فترة وضع درجات فردية باتّباع نمط قراءة-تعديل-كتابة. وهذا يعني أنّه عليك إجراء ما يلي:

  1. اقرأ قائمة فترات التقييم ضمن مورد GradingPeriodSettings باستخدام نقطة النهاية GetGradingPeriodSettings.
  2. أدخِل التعديلات التي اخترتها على قائمة فترات التقييم.
  3. أرسِل قائمة فترات وضع الدرجات الجديدة في طلب إلى UpdateGradingPeriodSettings.

سيساعدك هذا النمط في التأكّد من أنّ عناوين فترات وضع الدرجات الفردية في أحد الدورات الدراسية مختلفة وأنّه لا يتداخل تاريخا بدء فترات وضع الدرجات وانتهائها.

يُرجى مراعاة القواعد التالية بشأن تعديل قائمة فترات التقييم:

  1. تُعدّ فترات وضع الدرجات المُضافة إلى القائمة بدون رقم تعريف إضافات.
  2. تُعتبر الفترات الزمنية غير المتوفّرة في القائمة عمليات حذف.
  3. تُعتبر فترات التقييم التي لها معرّف حالي ولكن تم تعديل بياناتها تعديلات. ويتم ترك السمات غير المعدَّلة كما هي.
  4. تُعدّ الفترات الزمنية للتصنيف التي تتضمّن معرّفات جديدة أو غير معروفة أخطاء.

Python

ستستند التعليمات البرمجية التالية إلى المثال الوارد في هذا الدليل. تم إنشاء فترة تقييم جديدة بعنوان "الصيف". تم ضبط القيمة الحقيقية/الكاذبة applyToExistingCoursework على False في نص الطلب.

لإجراء ذلك، تتم قراءة GradingPeriodSettings الحالية، وتتم إضافة فترة تقييم جديدة إلى القائمة، ويتم ضبط القيمة المنطقيةapplyToExistingCoursework على False. تجدر الإشارة إلى أنّه لن تتم إزالة أي فترات وضع درجات سبق أن تم تطبيقها على "أعمال الدورة الدراسية" الحالية. في المثال السابق، سبق أن تم تطبيق فترَي التقييم "الفصل الدراسي الأول" و"الفصل الدراسي الثاني" على المهام الدراسية الحالية، ولن تتم إزالتها من المهام الدراسية إذا تم ضبط قيمة applyToExistingCoursework على False في الطلبات اللاحقة.

def add_grading_period(classroom_service, course_id):
    """
    A new grading period is added to the list, but it is not applied to existing courseWork.
    """
    try:
        # Use the `GetGradingPeriodSettings` endpoint to retrieve the existing
        # grading period IDs. You will need to include these IDs in the request
        # body to make sure existing grading periods aren't deleted.
        body = {
          "gradingPeriods": [
            {
              # Specify the ID to make sure the grading period is not deleted.
              "id": "FIRST_SEMESTER_GRADING_PERIOD_ID",
              "title": "First Semester",
              "start_date": {
                "day": 1,
                "month": 9,
                "year": 2023
              },
              "end_date": {
                "day": 15,
                "month": 12,
                "year": 2023
              }
            },
            {
              # Specify the ID to make sure the grading period is not deleted.
              "id": "SECOND_SEMESTER_GRADING_PERIOD_ID",
              "title": "Second Semester",
              "start_date": {
                "day": 15,
                "month": 1,
                "year": 2024
              },
              "end_date": {
                "day": 31,
                "month": 5,
                "year": 2024
              }
            },
            {
              # Does not include an ID because this grading period is an addition.
              "title": "Summer",
              "start_date": {
                "day": 1,
                "month": 6,
                "year": 2024
              },
              "end_date": {
                "day": 31,
                "month": 8,
                "year": 2024
              }
            }
          ],
          "applyToExistingCoursework": False
        }

        gradingPeriodSettings = classroom_service.courses().updateGradingPeriodSettings(
          courseId=course_id, body=body, updateMask='gradingPeriods,applyToExistingCoursework').execute()
        return gradingPeriodSettings

    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

إرشادات مفيدة حول الحقل المنطقي applyToExistingCoursework

من المهم تذكُّر أنّ القيمة المنطقية applyToExistingCoursework يتم الاحتفاظ بها، ما يعني أنّه إذا تم ضبط القيمة المنطقية على True في عملية سابقة للاتصال بواجهة برمجة التطبيقات ولم يتم تغييرها، سيتم تطبيق التعديلات اللاحقة على فترات التقييم على المهام الدراسية الحالية.

يُرجى العِلم أنّه في حال تغيير هذه القيمة المنطقية من True إلى False في طلب إلى UpdateGradingPeriodSettings، لن يتم تطبيق التغييرات الجديدة التي تجريها على GradingPeriodSettings فقط على CourseWork الحالية. لن تتم إزالة أي معلومات متعلقة بفترة التقييم التي تم تطبيقها على CourseWork في طلبات البيانات السابقة من واجهة برمجة التطبيقات عندما تم ضبط القيمة المنطقية على True. من الطرق المفيدة للتفكير في هذا الإعداد المنطقي أنّه يتيح ربط "أعمال الدورة التدريبية" الحالية بفترات التقييم المُعدّة، ولكنّه لا يتيح إزالة الربط الحالي بين "أعمال الدورة التدريبية" وفترات التقييم المُعدّة.

في حال حذف عنوان فترة تقييم أو تغييره، سيتم نشر هذه التغييرات في جميع أعمال الدورة التدريبية الحالية، بغض النظر عن إعداد القيمة المنطقية applyToExistingCoursework.

تعديل فترة وضع درجات فردية في القائمة

لتعديل بعض البيانات المرتبطة بفترة تقييم حالية، أدرِج رقم تعريف فترة التقييم الحالية في القائمة مع البيانات المعدَّلة.

Python

في هذا المثال، سيتم تعديل تاريخ انتهاء فترة التقييم "الصيف". سيتم ضبط الحقل applyToExistingCoursework على True. يُرجى العلم أنّ ضبط هذه القيمة المنطقية على True سيؤدي إلى تطبيق جميع فترات التقييم المُعدّة على "أعمال الدورة الدراسية" الحالية. في طلب واجهة برمجة التطبيقات السابق، تمَّ ضبط القيمة المنطقية على False لكي لا يتم تطبيق فترة التقييم "الصيف" على المهام الدراسية الحالية. بعد ضبط هذا الحقل المنطقي على True، سيتم تطبيق فترة التقييم "الصيف" على كل الأعمال الدراسية الحالية التي تتم مطابقتها.

def update_existing_grading_period(classroom_service, course_id):
    """
    An existing grading period is updated.
    """
    try:
        # Use the `GetGradingPeriodSettings` endpoint to retrieve the existing
        # grading period IDs. You will need to include these IDs in the request
        # body to make sure existing grading periods aren't deleted.
        body = {
          "gradingPeriods": [
            {
              "id": "FIRST_SEMESTER_GRADING_PERIOD_ID",
              "title": "First Semester",
              "start_date": {
                "day": 1,
                "month": 9,
                "year": 2023
              },
              "end_date": {
                "day": 15,
                "month": 12,
                "year": 2023
              }
            },
            {
              "id": "SECOND_SEMESTER_GRADING_PERIOD_ID",
              "title": "Second Semester",
              "start_date": {
                "day": 15,
                "month": 1,
                "year": 2024
              },
              "end_date": {
                "day": 31,
                "month": 5,
                "year": 2024
              }
            },
            {
              # The end date for this grading period will be modified from August 31, 2024 to September 10, 2024.
              # Include the grading period ID in the request along with the new data.
              "id": "SUMMER_GRADING_PERIOD_ID",
              "title": "Summer",
              "start_date": {
                "day": 1,
                "month": 6,
                "year": 2024
              },
              "end_date": {
                "day": 10,
                "month": 9,
                "year": 2024
              }
            }
          ],
          "applyToExistingCoursework": True
        }

        gradingPeriodSettings = classroom_service.courses().updateGradingPeriodSettings(
          courseId=course_id, body=body, updateMask='gradingPeriods,applyToExistingCoursework').execute()
        return gradingPeriodSettings

    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

حذف فترة وضع درجات فردية

لحذف فترة وضع الدرجات، احذف فترة وضع الدرجات من القائمة. يُرجى العلم أنّه في حال حذف فترة وضع الدرجات، سيتم أيضًا حذف أي إشارة إلى فترة وضع الدرجات في CourseWork بغض النظر عن إعداد applyToExistingCoursework.

Python

لمواصلة المثال الوارد في هذا الدليل، احذف فترة التقييم "الصيف" .

def delete_grading_period(classroom_service, course_id):
    """
    An existing grading period is deleted.
    """
    try:
        body = {
          "gradingPeriods": [
            {
              "id": "FIRST_SEMESTER_GRADING_PERIOD_ID",
              "title": "First Semester",
              "start_date": {
                "day": 1,
                "month": 9,
                "year": 2023
              },
              "end_date": {
                "day": 15,
                "month": 12,
                "year": 2023
              }
            },
            {
              "id": "SECOND_SEMESTER_GRADING_PERIOD_ID",
              "title": "Second Semester",
              "start_date": {
                "day": 15,
                "month": 1,
                "year": 2024
              },
              "end_date": {
                "day": 31,
                "month": 5,
                "year": 2024
              }
            }
          ]
        }

        gradingPeriodSettings = classroom_service.courses().updateGradingPeriodSettings(
          courseId=course_id, body=body, updateMask='gradingPeriods').execute()
        return gradingPeriodSettings

    except HttpError as error:
        # Handle errors as appropriate for your application.
        print(f"An error occurred: {error}")
        return error

إدارة الحقل gradingPeriodId في CourseWork

يتضمّن مرجع CourseWork حقل gradingPeriodId. يمكنك استخدام نقاط نهاية CourseWork لقراءة وكتابة فترة التقييم المرتبطة بأحد محتوى CourseWork. هناك ثلاث طرق لإدارة هذا الربط:

  • الربط التلقائي لفترة وضع الدرجات بالتاريخ
  • فترة وضع درجات مخصّصة مرتبطة
  • ما مِن ربط بفترة وضع الدرجات

1. ربط فترة وضع الدرجات بالتاريخ

عند إنشاء "عمل المقرر الدراسي"، يمكنك السماح لخدمة Classroom بمعالجة عملية ربط فترة التقييم نيابةً عنك. لإجراء ذلك، يجب حذف الحقل gradingPeriodId من طلب CourseWork. بعد ذلك، حدِّد الحقلَين dueDate أو scheduledTime في طلب CourseWork. إذا كان dueDate يقع ضمن نطاق زمني حالي للفترة لوضع الدرجات، سيضبط Classroom رقم تعريف هذه الفترة لوضع الدرجات في CourseWork. في حال عدم تحديد الحقل dueDate، تحدِّد Google ClassroomgradingPeriodId استنادًا إلى الحقل scheduledTime. في حال عدم تحديد أيّ من الحقلين، أو في حال عدم تطابق النطاق الزمني للفترة التي يتم فيها وضع الدرجات ، لن يتم ضبط gradingPeriodId على CourseWork.

2. فترة وضع الدرجات المخصّصة المرتبطة

إذا كنت تريد ربط CourseWork بفترة تقييم مختلفة عن الفترة التي تتوافق مع dueDate أو scheduledTime، يمكنك تحديد الحقل gradingPeriodId يدويًا عند إنشاء CourseWork أو تعديله. في حال تحديدgradingPeriodId يدويًا، لن تُجري Classroom عملية الربط التلقائي لفترة وضع الدرجات استنادًا إلى التاريخ.

3- لم يتم ربط فترة وضع الدرجات

إذا كنت لا تريد ربط CourseWork بأي فترة تقييم على الإطلاق، اضبط الحقل gradingPeriodId في طلب CourseWork على سلسلة خالية (gradingPeriodId: "").

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

انتقال

courseWork := &classroom.CourseWork{
  Title: "Homework questions",
  WorkType: "ASSIGNMENT",
  State: "DRAFT",
  // ...other CourseWork fields...
  GradingPeriodId: "",
  ForceSendFields: []string{"GradingPeriodId"},
}

ماذا يحدث لمعرّف فترة وضع الدرجات في حال تعديل تاريخ الاستحقاق؟

إذا كنت تعدّل حقل CourseWork dueDate وتريد الاحتفاظ بربط مخصّص أو عدم ربط فترة وضع الدرجات، عليك تضمين dueDate و gradingPeriodId في updateMask ونص الطلب. سيؤدي ذلك إلى توجيه Classroom إلى عدم إلغاء gradingPeriodId باستخدام فترة تقييم تطابق مع dueDate الجديدة.

Python

body = {
  "dueDate": {
    "month": 6,
    "day": 10,
    "year": 2024
  },
  "dueTime": {
    "hours": 7
  },
  "gradingPeriodId": "<INSERT-GRADING-PERIOD-ID-OR-EMPTY-STRING>"
}
courseWork = classroom_service.courses().courseWork().patch(
  courseId=course_id, id=coursework_id, body=body,
  updateMask='dueDate,dueTime,gradingPeriodId') # include the gradingPeriodId field in the updateMask
.execute()