المرفقات الخارجية والاستلام

هذه هي الجولةالسابعة في سلسلة جولات الشرح المتعلّقة بإضافات Classroom.

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

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

يمكنك توسيع نطاق الإصدار النهائي من الإضافة الذي يتيح استخدام أنواع المحتوى أو المرفقات من النوع "نشاط". يتم استخدام مرفق نوع المحتوى في هذا الدليل.

إضافة نطاق OAuth لإدارة المهام

تأكَّد من أنّ تطبيقك يطلب النطاقات التالية:

  • https://www.googleapis.com/auth/classroom.addons.teacher
  • https://www.googleapis.com/auth/classroom.addons.student
  • https://www.googleapis.com/auth/classroom.coursework.students

لم يكن نطاق classroom.coursework.students مطلوبًا في السابق، ويتم استخدامه لإنشاء أو تعديل عمليات منح CourseWork. أضِف هذا النطاق إلى قوائم النطاقات في حزمة تطوير البرامج (SDK) في Google Workspace Marketplace وشاشة موافقة OAuth و رمز الخادم في مشروعك على Cloud.

Python

  SCOPES = [
    "https://www.googleapis.com/auth/classroom.addons.teacher",
    "https://www.googleapis.com/auth/classroom.addons.student",
    "https://www.googleapis.com/auth/classroom.coursework.students",
  ]

إنشاء مهمة في Classroom

إضافة أزرار إلى صفحة ويب غير مضمّنة في إطار

يتيح المسار الموضّح في هذه الجولة الإرشادية للمستخدم إنشاء assignments (المهام) وattachments (المرفقات) في Google Classroom من منتج غير تابع لشركة Google. في العادة، يكون ذلك هو موقعك الإلكتروني أو تطبيقك الحالي. في هذا المثال، عليك إنشاء صفحة ويب وهمية لتبدو كموقع إلكتروني خارجي. تحتاج إلى زر أو رابط يؤدي عند النقر عليه إلى فتح مسار جديد ينفِّذ مسارCourseWork المقترَح لإنشاء مهمة جديدة.

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

Python

يعدّل مثال Python المقدَّم مسار /index الذي تم تقديمه في الخطوة الأولى من الجولة الإرشادية.

<!-- /webapp/templates/index.html -->
<a href="clear-credentials.html">Logout</a>
<a href="start-auth-flow.html">Login</a>

<br>

<a href="create-coursework-assignment.html">Create a CourseWork Assignment</a>

أضِف نموذج HTML لتمثيل وجهة في موقعك الإلكتروني. ستعرض هذه الصفحة المحتوى الذي سيتم إرفاقه بمهمتك في CourseWork.

<!-- /webapp/templates/example-coursework-assignment.html -->
<h1>CourseWork assignment loaded!</h1>
<p>You've loaded a CourseWork assignment! It was created from an external web page.</p>

أنشئ ملف وحدة Python جديدًا لمعالجة المسارات ذات الصلة بـ CourseWork. يمثّل هذا العنصر coursework_routes.py في المثال المقدَّم. أضِف ملف تعريف القنوات التالية الثلاثة، مع العِلم أنّك ستملؤ بعض المحتوى لاحقًا.

# /webapp/coursework_routes.py
@app.route("/create-coursework-assignment")
def create_coursework_assignment():
  """
  Completes the assignment creation flow.
  """

  # Check that the user is signed in. If not, perform the OAuth 2.0
  # authorization flow.
  credentials = get_credentials()

  if not credentials:
    return start_auth_flow("coursework_assignment_callback")

  # Construct the Google Classroom service.
  classroom_service = get_classroom_service()

  pass  # To be completed later.

@app.route("/example-coursework-assignment/<assignment_type>")
def example_coursework_assignment(assignment_type):
  """
  Renders the "example-coursework-assignment.html" template.
  """
  return flask.render_template(
      "example-coursework-assignment.html", assignment_type=assignment_type
  )

@app.route("/coursework-assignment-callback")
def coursework_assignment_callback():
  """
  Completes the OAuth 2.0 handshake and stores credentials in the session.
  This is identical to the callback introduced in the sign-in walkthrough,
  but redirects the user to the index page instead of the attachment
  discovery page.
  """
  flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
      CLIENT_SECRETS_FILE,
      scopes=SCOPES,
      state=flask.session["state"],
      redirect_uri=flask.url_for("coursework_assignment_callback", _external=True),
  )

  flow.fetch_token(authorization_response=flask.request.url)

  credentials = flow.credentials
  flask.session["credentials"] = session_credentials_to_dict(
      credentials
  )

  # Close the current window and redirect the user to the index page.
  return flask.render_template("close-me.html", redirect_destination="index")

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

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

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

Python

# /webapp/coursework_routes.py
@app.route("/create-coursework-assignment")
def create_coursework_assignment():
  """
  Completes the assignment creation flow.
  """
  # ... Check that the user is signed in and get the Classroom service ...

  # Check whether the user can create add-on attachments.
  eligibility_response = (
      classroom_service.userProfiles()
      .checkUserCapability(
        userId="me",
        capability="CREATE_ADD_ON_ATTACHMENT",
        # The previewVersion is necessary while the method is available in the
        # Workspace Developer Preview Program.
        previewVersion="V1_20240930_PREVIEW",
      ).execute()
  )
  is_create_attachment_eligible = eligibility_response.get("allowed")

  if is_create_attachment_eligible:
    # See the "Create an assignment with add-on attachment for eligible users" section for implementation.
  if not is_create_attachment_eligible:
    # See the "Create a Link Material" section for implementation.

إنشاء مهمة تتضمّن مرفقًا إضافيًا للمستخدمين المؤهَّلين

إذا كان المستخدم مؤهلاً لإنشاء مرفقات إضافية، اتّبِع الخطوات التالية:

  1. أرسِل طلبًا إلى واجهة برمجة التطبيقات لإنشاء مهمة courseWork في Google Classroom بدون مرفقات.
  2. استخرِج id للمهمة التي تم إنشاؤها حديثًا.
  3. أنشئ عمل طلابي AddOnAttachment جديدًا.
  4. أرسِل طلبًا لإنشاء مرفق إضافي في المَهمّة التي تم إنشاؤها حديثًا في Google Classroom.

Python

# The ID of the course to which the assignment will be added.
course_id = 1234567890  # TODO(developer) Replace with an actual course ID.

# /webapp/coursework_routes.py
if is_create_attachment_eligible:
  # Create an assignment.
  coursework = {
      "title": "My CourseWork Assignment with Add-on Attachment",
      "description": "Created using the Classroom CourseWork API.",
      "workType": "ASSIGNMENT",
      "state": "DRAFT",  # Set to 'PUBLISHED' to assign to students.
  }

  # Issue a request to create the assignment.
  create_assignment_response = (
      classroom_service.courses()
      .courseWork()
      .create(courseId=course_id, body=coursework)
      .execute()
  )

  # Create an add-on attachment that links to the selected content and
  # associate it with the new assignment.
  content_url = flask.url_for(
      "example_coursework_assignment",
      assignment_type="add-on-attachment",
      _scheme="https",
      _external=True,
  )

  # Construct an AddOnAttachment instance.
  attachment = {
      "teacherViewUri": {"uri": content_url},
      "studentViewUri": {"uri": content_url},
      "title": f'Test Attachment for Assignment {create_assignment_response.get("id")}',
  }

  # Issue a request to create the attachment.
  add_on_attachment_response = (
      classroom_service.courses()
      .courseWork()
      .addOnAttachments()
      .create(
          courseId=course_id,
          itemId=create_assignment_response.get("id"),  # ID of the new assignment.
          body=attachment,
      )
      .execute()
  )

إذا كان المستخدم غير مؤهَّل لإنشاء مرفقات إضافية، يمكنك إنشاء رابط مادة بدلاً من ذلك باتّباع الخطوات التالية:

Python

# The ID of the course to which the assignment will be added.
course_id = 1234567890  # TODO(developer) Replace with an actual course ID.

if not is_create_attachment_eligible:
    coursework = {
        "title": "My CourseWork Assignment with Link Material",
        "description": "Created using the Classroom CourseWork API.",
        "workType": "ASSIGNMENT",
        "state": "DRAFT",  # Set to 'PUBLISHED' to assign to students.
        # Specify the URL for your content as a Link Material.
        "materials": [
            {
                "link": {
                    "url": flask.url_for(
                        "example_coursework_assignment",
                        assignment_type="link-material",
                        _scheme="https",
                        _external=True,
                    )
                }
            }
        ],
    }

    # Issue a request to create the assignment.
    assignment_response = (
        classroom_service.courses()
        .courseWork()
        .create(courseId=course_id, body=coursework)
        .execute()
    )

تعديل مهمة تم إنشاؤها من قبل

يمكنك الوصول إلى أي عنصر في جدول البث في Google Classroom يحتوي على مرفق واحد على الأقل من المرفقات الإضافية الخاصة بك، أو تعديله أو إرساله أو استرداده أو إرجاعه، بغض النظر عمن أنشأه. عناصر "البث" هي أي Announcement أو CourseWork مَهمّة دراسية أو CourseWorkMaterial.

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

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

Python

يعدّل مثال Python المقدَّم مسار /index الذي تم تعديله في وقت سابق من هذه الجولة الإرشادية.

<!-- /webapp/templates/index.html -->
<a href="modify-coursework-assignment.html">Create a CourseWork Assignment</a>

أنشئ مسارًا جديدًا لمعالجة المسارات ذات الصلة بـ CourseWork. يمكنك العثور على هذا الرمز في ملف coursework_routes.py في المثال الذي قدّمناه.

# Check that the user is signed in.
credentials = get_credentials()

if not credentials:
  return start_auth_flow("coursework_assignment_callback")

# Get the Google Classroom service.
classroom_service = get_classroom_service()

# The ID of the course to which the assignment will be added.
# Ordinarily, you'll prompt the user to specify which course to use. For
# simplicity, we use a hard-coded value in this example.
course_id = 1234567890  # TODO(developer) Replace with an actual course ID.
assignment_id = 1234567890  # TODO(developer) Replace with an actual assignment ID.

# Retrieve details about the CourseWork assignment.
get_coursework_response = (
    classroom_service.courses()
    .courseWork()
    .get(courseId=course_id, id=assignment_id)
    .execute()
)

# Alter the current title.
assignment_title = f"{get_coursework_response.get('title')} (Modified by API request)"

# Issue a request to modify the assignment.
modify_coursework_response = (
    classroom_service.courses()
    .courseWork()
    .patch(
        courseId=course_id,
        id=assignment_id,
        updateMask="title",
        body={"title": assignment_title},
    )
    .execute()
)

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

لتبسيط الأمور، تستخدِم الأمثلة المقدَّمة معرّفات مُبرمَجة للدورة التدريبية والمهام. يمكنك الحصول على هذه المعرّفات من خلال تقديم طلبات باستخدام بيانات اعتماد المعلّم إلى طريقتَي get وlist لموارد courses و courseWork. ويتم عرضها أيضًا في الردّ عند إنشاء assignments courseWork.

شغِّل الخادم، ثم انتقِل إلى صفحة الفهرس وسجِّل الدخول بصفتك مستخدمًا معلّمًا بدون ترخيص Teaching and Learning أو Plus من Google Workspace for Education. يمكنك تبديل حالة ترخيص المستخدم من ملف المشرف في نطاقك التجريبي.انقر على الزر إنشاء مهمة عمل دراسي ، ثم افتح واجهة مستخدم Google Classroom وتأكَّد من أنّه تم إنشاء مهمة تتضمّن ملف مرفقًا بعنوان رابط إلى مادة. يجب أن يعرض المرفق عنوان صفحة الويب المرتبطة وعنوان URL.

اختبار إنشاء مرفقات الإضافات

ارجع إلى صفحة الفهرس وسجِّل الدخول بصفتك معلّمًا يملك ترخيص Google Workspace for Education Teaching & Learning أو Plus. انقر على الزر إنشاء مهمة دراسية ، ثم افتح واجهة مستخدم Google Classroom وتأكَّد من إنشاء مهمة دراسية تحتوي على مرفق إضافي. يجب أن يعرض المرفق اسم طلب الإضافة والعنوان المحدّد في الرمز.

تعديل مهمة الاختبار

ارجع إلى صفحة الفهرس وتأكَّد من تسجيل الدخول بصفتك مستخدمًا معلّمًا باستخدام ترخيص Teaching and Learning أو Plus. انقر على زر تعديل مهمة في CourseWork، ثم عُد إلى واجهة مستخدم Google Classroom وتأكَّد من أنّه تم تغيير عنوان المهمة.

تهانينا! لقد أكملت سلسلة الخطوات الإرشادية.

إنّ محتوى هذه الصفحة مرخّص بموجب ترخيص Creative Commons Attribution 4.0‏ ما لم يُنصّ على خلاف ذلك، ونماذج الرموز مرخّصة بموجب ترخيص Apache 2.0‏. للاطّلاع على التفاصيل، يُرجى مراجعة سياسات موقع Google Developers‏. إنّ Java هي علامة تجارية مسجَّلة لشركة Oracle و/أو شركائها التابعين.

تاريخ التعديل الأخير: 2024-11-22 (حسب التوقيت العالمي المتفَّق عليه)