پیوست های خارجی & نوبت در

این هفتمین راهنمای گام به گام از مجموعه راهنمای افزونه‌های 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 استفاده می‌شود. این دامنه را به لیست دامنه‌های موجود در Google Workspace Marketplace SDK پروژه Cloud خود، صفحه رضایت OAuth و کد سرور خود اضافه کنید.

پایتون

  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",
  ]

ایجاد تکلیف در کلاس درس

دکمه‌ها را به یک صفحه وب بدون iframe اضافه کنید

روندی که در این راهنما شرح داده شده است به کاربر اجازه می‌دهد تا تکالیف و پیوست‌های Google Classroom را از یک محصول غیر گوگل ایجاد کند. در عمل، این احتمالاً وب‌سایت یا برنامه موجود شماست. برای این مثال، شما باید یک صفحه وب آزمایشی ایجاد کنید تا به عنوان یک سایت خارجی عمل کند. شما به یک دکمه یا لینک نیاز دارید که با کلیک روی آن، مسیر جدیدی باز شود که روند پیشنهادی CourseWork را برای ایجاد یک تکلیف جدید انجام دهد.

همچنین اگر دکمه یا لینکی ندارید، باید آن را اضافه کنید تا کاربر بتواند وارد سیستم شود . برای درخواست‌های بعدی API به اطلاعات کاربری نیاز خواهید داشت، بنابراین آنها باید فرآیند OAuth 2.0 handshake را تکمیل کنند. برای راهنمایی‌های بیشتر، به راهنمای ورود به سیستم مراجعه کنید.

پایتون

مثال پایتون ارائه شده، مسیر /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>

یک فایل ماژول پایتون جدید برای مدیریت مسیرهای مرتبط با 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")

بررسی واجد شرایط بودن کاربر برای ایجاد پیوست

چندین پیش‌نیاز وجود دارد که یک کاربر باید قبل از اینکه بتوانید از طرف او افزونه‌هایی برای پیوست‌ها ایجاد کنید، آنها را داشته باشد. برای راحتی، گوگل متد userProfiles.checkUserCapability را برای تعیین اینکه آیا یک کاربر این پیش‌نیازها را دارد یا خیر، ارائه می‌دهد. کاربری که پیش‌نیازها را داشته باشد، کاربر واجد شرایط نامیده می‌شود.

بررسی واجد شرایط بودن را به پیاده‌سازی مسیر ایجاد CourseWork اضافه کنید. سپس فیلد allowed را در پاسخ آزمایش کنید. برای کاربران واجد شرایط، منطق ایجاد یک تکلیف با پیوست افزونه را دنبال کنید. در غیر این صورت، یک Link Material ایجاد کنید. شما باید شناسه دوره‌ای را که کاربر می‌خواهد در آن تکلیف ایجاد کند، بدانید. معمولاً، از کاربر می‌خواهید مشخص کند که از کدام دوره استفاده کند. برای سادگی، در این مثال از یک مقدار ثابت استفاده می‌کنیم.

پایتون

# /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. یک درخواست API برای ایجاد یک تکلیف courseWork در Google Classroom بدون هیچ پیوستی ارسال کنید.
  2. id تکلیف تازه ایجاد شده را استخراج کنید.
  3. یک CourseWork AddOnAttachment جدید بسازید.
  4. درخواستی برای ایجاد پیوست افزونه به تکلیف تازه ایجاد شده در Google Classroom ارسال کنید.

پایتون

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

اگر کاربر واجد شرایط ایجاد پیوست‌های افزونه نیست ، به جای آن با انجام موارد زیر یک Link Material ایجاد کنید:

پایتون

# 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 می‌شوند.

برای نشان دادن این موضوع، مسیری را برای تغییر یک آیتم جریان داده شده اضافه خواهید کرد. از این روش برای تأیید اینکه می‌توانید به آیتم‌های جریان ایجاد شده توسط خودتان با استفاده از API و ایجاد شده توسط معلم از طریق رابط کاربری Google Classroom دسترسی داشته باشید و آنها را تغییر دهید، استفاده کنید.

یک لینک یا دکمه دیگر به صفحه وبی که ابتدا در این راهنما ویرایش کردید اضافه کنید. این کار باید یک مسیر جدید برای تغییر یک تکلیف CourseWork باز کند.

پایتون

مثال پایتون ارائه شده، مسیر /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 دریافت کنید. آن‌ها همچنین هنگام ایجاد تکالیف courseWork در پاسخ بازگردانده می‌شوند.

سرور خود را اجرا کنید، سپس به صفحه فهرست خود بروید و به عنوان یک کاربر معلم بدون مجوز Google Workspace for Education Teaching & Learning یا Plus وارد سیستم شوید. می‌توانید وضعیت مجوز کاربر را از کنسول مدیریت دامنه آزمایشی خود تغییر دهید. روی دکمه ایجاد یک تکلیف CourseWork کلیک کنید ، سپس رابط کاربری Google Classroom را باز کنید و تأیید کنید که یک تکلیف با پیوست Link Material ایجاد شده است. پیوست باید عنوان صفحه وب پیوند شده و یک URL را نشان دهد.

ایجاد پیوست افزونه را آزمایش کنید

به صفحه فهرست برگردید و به عنوان یک کاربر معلم با مجوز Google Workspace for Education Teaching & Learning یا Plus وارد سیستم شوید. روی دکمه ایجاد یک تکلیف CourseWork کلیک کنید، سپس رابط کاربری Google Classroom را باز کنید و تأیید کنید که یک تکلیف با پیوست افزونه ایجاد شده است. پیوست باید نام برنامه افزونه شما و عنوان مشخص شده در کد شما را نشان دهد.

اصلاح تکلیف آزمون

به صفحه فهرست برگردید و مطمئن شوید که به عنوان کاربر معلم با مجوز Teaching & Learning یا Plus وارد سیستم شده‌اید. روی دکمه «تغییر تکلیف دوره» کلیک کنید، سپس به رابط کاربری Google Classroom برگردید و تأیید کنید که عنوان تکلیف تغییر داده شده است.

تبریک می‌گویم! شما مجموعه مراحل را به پایان رساندید.