نمرات ضمیمه و برگشت نمره

این ششمین راهنمای گام به گام از مجموعه راهنمای افزونه‌های Classroom است.

در این راهنمای گام به گام، شما مثال مرحله قبل را اصلاح می‌کنید تا یک پیوست از نوع فعالیت نمره‌دار ایجاد کنید. همچنین نمره‌ای را به صورت برنامه‌نویسی به Google Classroom ارسال می‌کنید که در دفتر نمره معلم به عنوان نمره پیش‌نویس ظاهر می‌شود.

این راهنمای گام به گام کمی با سایر راهنماهای این مجموعه متفاوت است، زیرا دو رویکرد ممکن برای بازگرداندن نمرات به Classroom وجود دارد. هر دو رویکرد تأثیرات متمایزی بر تجربه توسعه‌دهنده و کاربر دارند؛ هنگام طراحی افزونه Classroom خود، هر دو را در نظر بگیرید. برای بحث بیشتر در مورد گزینه‌های پیاده‌سازی، صفحه راهنمای تعامل با پیوست‌ها را مطالعه کنید.

توجه داشته باشید که ویژگی‌های نمره‌دهی در API اختیاری هستند. آن‌ها را می‌توان با هر پیوستی از نوع فعالیت استفاده کرد.

در طول این راهنمای گام به گام، موارد زیر را تکمیل می‌کنید:

  • درخواست‌های قبلی ایجاد پیوست به Classroom API را اصلاح کنید تا مخرج نمره پیوست نیز تنظیم شود.
  • به صورت برنامه‌نویسی‌شده به فایل ارسالی دانشجو نمره بدهید و صورت کسر نمره فایل پیوست را تنظیم کنید.
  • دو رویکرد برای ارسال نمره‌ی ارائه به کلاس درس با استفاده از اعتبارنامه‌های معلمِ وارد شده یا آفلاین پیاده‌سازی کنید.

پس از اتمام، نمرات پس از فعال شدن رفتار بازگشت به عقب در دفتر نمرات کلاس نمایش داده می‌شوند. لحظه دقیق وقوع این اتفاق به رویکرد پیاده‌سازی بستگی دارد.

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

ویژگی نمره‌دهی API افزونه‌های Classroom را درک کنید

افزونه شما می‌تواند هم صورت کسر و هم مخرج کسر نمره را برای یک پیوست تنظیم کند. این مقادیر به ترتیب با استفاده از مقادیر pointsEarned و maxPoints در API تنظیم می‌شوند. یک کارت پیوست در رابط کاربری Classroom، مقدار maxPoints را پس از تنظیم نشان می‌دهد.

مثالی از چندین پیوست با حداکثر امتیاز در یک تکلیف

شکل ۱. رابط کاربری ایجاد تکلیف به همراه سه کارت ضمیمه اضافی که maxPoints در آنها تنظیم شده است.

رابط برنامه‌نویسی کاربردی افزونه‌های کلاس درس به شما امکان می‌دهد تنظیمات مربوط به نمرات پیوست را پیکربندی کرده و امتیاز کسب‌شده برای آنها را تعیین کنید. این نمرات با نمرات تکالیف یکسان نیستند. با این حال، تنظیمات نمره تکالیف از تنظیمات نمره پیوست پیوستی که برچسب همگام‌سازی نمره (Grade sync ) را روی کارت پیوست خود دارد، پیروی می‌کند. وقتی پیوست «همگام‌سازی نمره» pointsEarned برای ارسال دانشجو تعیین می‌کند، نمره پیش‌نویس دانشجو را نیز برای تکلیف تعیین می‌کند.

معمولاً اولین پیوستی که به تکلیفی که maxPoints را تنظیم می‌کند اضافه می‌شود، برچسب "Grade sync" را دریافت می‌کند. برای مثالی از برچسب "Grade sync" به مثال رابط کاربری ایجاد تکلیف که در شکل 1 نشان داده شده است، مراجعه کنید. توجه داشته باشید که کارت "Attachment 1" دارای برچسب "Grade sync" است و نمره تکلیف در کادر قرمز به 50 امتیاز به‌روزرسانی شده است. همچنین توجه داشته باشید که اگرچه شکل 1 سه کارت پیوست را نشان می‌دهد، اما فقط یک کارت دارای برچسب "Grade sync" است. این یک محدودیت کلیدی در پیاده‌سازی فعلی است: فقط یک پیوست می‌تواند برچسب "Grade sync" را داشته باشد .

اگر چندین پیوست وجود داشته باشد که maxPoints را تنظیم کرده‌اند، حذف پیوست با "Grade sync" "Grade sync" را برای هیچ یک از پیوست‌های باقی‌مانده فعال نمی‌کند . افزودن پیوست دیگری که maxPoints را تنظیم می‌کند، Grade Sync را برای پیوست جدید فعال می‌کند و حداکثر نمره تخصیص برای مطابقت تنظیم می‌شود. هیچ مکانیزمی برای برنامه‌ریزی وجود ندارد که ببیند کدام پیوست دارای برچسب "Grade sync" است و همچنین تعداد پیوست‌های یک تکلیف خاص را نشان دهد.

حداکثر امتیاز یک پیوست را تنظیم کنید

این بخش، تنظیم مخرج کسر برای نمره پیوست را شرح می‌دهد؛ یعنی حداکثر نمره ممکنی که همه دانش‌آموزان می‌توانند برای مطالب ارسالی خود کسب کنند. برای انجام این کار، مقدار maxPoints پیوست را تنظیم کنید.

فقط یک تغییر جزئی در پیاده‌سازی موجود ما برای فعال کردن ویژگی‌های نمره‌دهی لازم است. هنگام ایجاد یک پیوست، مقدار maxPoints را در همان شیء AddOnAttachment که شامل فیلدهای studentWorkReviewUri ، teacherViewUri و سایر فیلدهای پیوست است، اضافه کنید.

توجه داشته باشید که حداکثر امتیاز پیش‌فرض برای یک تکلیف جدید ۱۰۰ است. پیشنهاد می‌کنیم maxPoints را روی مقداری غیر از ۱۰۰ تنظیم کنید تا بتوانید تأیید کنید که نمرات به درستی تنظیم می‌شوند. به عنوان مثال، maxPoints را روی ۵۰ تنظیم کنید:

پایتون

فیلد 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 را در پایگاه داده محلی Attachment خود ذخیره می‌کنید؛ این کار باعث می‌شود که بعداً هنگام نمره‌دهی به ارسال‌های دانش‌آموزان، نیازی به فراخوانی API اضافی نداشته باشید. با این حال، توجه داشته باشید که ممکن است معلمان تنظیمات نمره تکلیف را مستقل از افزونه شما تغییر دهند. برای مشاهده مقدار maxPoints در سطح تکلیف، یک درخواست GET به نقطه پایانی courses.courseWork ارسال کنید. هنگام انجام این کار، itemId را در فیلد CourseWork.id ارسال کنید.

اکنون مدل پایگاه داده خود را به‌روزرسانی کنید تا مقدار maxPoints فایل پیوست را نیز در خود نگه دارد. توصیه می‌کنیم از مقدار maxPoints از پاسخ CREATE استفاده کنید:

پایتون

ابتدا، یک فیلد 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()

اکنون پیوست دارای حداکثر نمره است. اکنون باید بتوانید این رفتار را آزمایش کنید؛ یک پیوست به یک تکلیف جدید اضافه کنید و مشاهده کنید که کارت پیوست برچسب "همگام‌سازی نمره" را نشان می‌دهد و مقدار "امتیازات" تکلیف تغییر می‌کند.

نمره ارائه دانشجو را در کلاس درس تنظیم کنید

این بخش نحوه تنظیم صورت کسر برای نمره پیوست را شرح می‌دهد؛ یعنی امتیاز هر دانش‌آموز برای پیوست. برای انجام این کار، امتیاز pointsEarned برای ارسال پیوست دانش‌آموز را تعیین کنید.

اکنون باید یک تصمیم مهم بگیرید: افزونه شما چگونه باید درخواست تعیین pointsEarned صادر کند ؟

مشکل این است که تنظیم pointsEarned نیاز به محدوده OAuth teacher دارد . شما نباید محدوده teacher را به کاربران دانش‌آموز اعطا کنید؛ این امر می‌تواند منجر به رفتار غیرمنتظره‌ای هنگام تعامل دانش‌آموزان با افزونه شما شود، مانند بارگذاری iframe نمای معلم به جای iframe نمای دانش‌آموز. بنابراین، شما دو انتخاب برای نحوه تنظیم pointsEarned دارید:

  • با استفاده از اعتبارنامه معلم وارد شده.
  • استفاده از اعتبارنامه‌های معلم ذخیره‌شده (آفلاین).

بخش‌های زیر، قبل از نمایش هر پیاده‌سازی، به بررسی مزایا و معایب هر رویکرد می‌پردازند. توجه داشته باشید که مثال‌های ارائه شده ما هر دو رویکرد برای قبولی در آزمون Classroom را نشان می‌دهند؛ برای مشاهده نحوه انتخاب یک رویکرد هنگام اجرای مثال‌های ارائه شده، به دستورالعمل‌های خاص زبان در زیر مراجعه کنید:

پایتون

عبارت SET_GRADE_WITH_LOGGED_IN_USER_CREDENTIALS را در بالای فایل webapp/attachment_routes.py پیدا کنید. برای ارسال نمرات با استفاده از اعتبارنامه‌های معلم وارد شده، این مقدار را روی True تنظیم کنید. برای ارسال نمرات با استفاده از اعتبارنامه‌های ذخیره شده هنگام ارسال فعالیت توسط دانش‌آموز، این مقدار را روی False تنظیم کنید.

با استفاده از اعتبارنامه معلم وارد شده، نمرات را تنظیم کنید

از اعتبارنامه‌های کاربر وارد شده برای صدور درخواست تنظیم pointsEarned استفاده کنید. این باید کاملاً شهودی به نظر برسد زیرا بقیه پیاده‌سازی تاکنون را منعکس می‌کند و برای تحقق آن به تلاش کمی نیاز است.

با این حال، در نظر داشته باشید که معلم فقط با ارائه دانش‌آموز در iframe بررسی کار دانش‌آموز تعامل دارد. این موضوع پیامدهای مهمی دارد:

  • تا زمانی که معلم در رابط کاربری کلاس درس اقدامی انجام ندهد، هیچ نمره‌ای در کلاس درس ثبت نمی‌شود.
  • یک معلم ممکن است مجبور باشد هر فرم ارسالی دانش‌آموز را باز کند تا بتواند نمرات همه دانش‌آموزان را ثبت کند.
  • بین دریافت نمره توسط Classroom و نمایش آن در رابط کاربری Classroom، یک تأخیر کوتاه وجود دارد. این تأخیر معمولاً پنج تا ده ثانیه است، اما می‌تواند تا 30 ثانیه نیز طول بکشد.

ترکیب این عوامل به این معنی است که معلمان ممکن است مجبور باشند کارهای دستی قابل توجه و وقت‌گیری را برای ثبت کامل نمرات یک کلاس انجام دهند.

برای پیاده‌سازی این رویکرد، یک فراخوانی API دیگر به مسیر بررسی کار دانشجویی موجود خود اضافه کنید.

پس از واکشی رکوردهای ارسال و پیوست دانشجو، ارسال دانشجو را ارزیابی کرده و نمره حاصل را ذخیره کنید. نمره را در فیلد pointsEarned از یک شیء AddOnAttachmentStudentSubmission تنظیم کنید. در نهایت، یک درخواست PATCH به نقطه پایانی courses.courseWork.addOnAttachments.studentSubmissions با نمونه AddOnAttachmentStudentSubmission در بدنه درخواست ارسال کنید. توجه داشته باشید که ما همچنین باید pointsEarned در updateMask در درخواست PATCH خود مشخص کنیم:

پایتون

# 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 استفاده کنید.

یک مزیت مهم این رویکرد این است که نمرات بدون نیاز به اقدام معلم در رابط کاربری کلاس درس ثبت می‌شوند و از مشکلات ذکر شده در بالا جلوگیری می‌شود. نتیجه این است که کاربران نهایی تجربه نمره‌دهی را یکپارچه و کارآمد می‌دانند. علاوه بر این، این رویکرد به شما امکان می‌دهد لحظه‌ای را که نمرات را به عقب برمی‌گردانید، انتخاب کنید، مانند زمانی که دانش‌آموزان فعالیت را تکمیل می‌کنند یا به صورت غیرهمزمان.

برای اجرای این رویکرد، وظایف زیر را انجام دهید:

  1. رکوردهای پایگاه داده کاربر را برای ذخیره یک توکن دسترسی تغییر دهید.
  2. رکوردهای پایگاه داده پیوست را برای ذخیره شناسه معلم تغییر دهید.
  3. اطلاعات معلم را بازیابی کنید و (به صورت اختیاری) یک نمونه سرویس Classroom جدید بسازید.
  4. نمره یک اثر ارسالی را تعیین کنید.

برای اهداف این نمایش، نمره را زمانی تنظیم کنید که دانش‌آموز فعالیت را تکمیل کند؛ یعنی زمانی که دانش‌آموز فرم را در مسیر Student View ارسال می‌کند.

تغییر رکوردهای پایگاه داده کاربر برای ذخیره توکن دسترسی

برای برقراری تماس‌های API، دو توکن منحصر به فرد مورد نیاز است، توکن تازه‌سازی (refresh token) و توکن دسترسی (access token ). اگر تا اینجای کار، سری مقالات آموزشی را دنبال کرده باشید، طرح جدول User شما باید از قبل یک توکن تازه‌سازی (refresh token) را ذخیره کرده باشد. ذخیره توکن تازه‌سازی زمانی کافی است که فقط با کاربر وارد شده تماس‌های API برقرار می‌کنید، زیرا یک توکن دسترسی به عنوان بخشی از جریان احراز هویت دریافت می‌کنید.

با این حال، اکنون باید به عنوان شخصی غیر از کاربر وارد شده، تماس برقرار کنید، به این معنی که جریان احراز هویت در دسترس نیست. بنابراین، باید توکن دسترسی را در کنار توکن تازه‌سازی ذخیره کنید. طرح جدول User خود را به‌روزرسانی کنید تا یک توکن دسترسی را شامل شود:

پایتون

در مثال ارائه شده ما، این در فایل 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 ایجاد یا به‌روزرسانی می‌کند، به‌روزرسانی کنید تا توکن دسترسی را نیز ذخیره کند:

پایتون

در مثال ارائه شده ما، این در فایل 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 پایگاه داده خود اضافه کنید:

پایتون

در مثال ارائه شده ما، این در فایل 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 ایجاد یا به‌روزرسانی می‌کند، به‌روزرسانی کنید تا شناسه سازنده را نیز ذخیره کند:

پایتون

در مثال ارائه شده ما، این در متد 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 برای کاربر معلم استفاده کنید:

پایتون

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

تعیین نمره یک اثر ارسالی

روش کار از اینجا به بعد مشابه استفاده از اطلاعات ورود معلم است. با این حال، توجه داشته باشید که باید با اطلاعات ورود معلم که در مرحله قبل بازیابی کرده‌اید، فراخوانی را انجام دهید:

پایتون

# 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 ثانیه طول بکشد. پس از آن، نمره دانش‌آموز خاص باید در سایر نماهای دفتر نمره کلاس درس نیز ظاهر شود.

تأیید کنید که نمره صحیح برای دانش‌آموز نمایش داده شده است.

تبریک! شما آماده‌اید تا به مرحله بعدی بروید: ایجاد پیوست‌ها خارج از Google Classroom .