やりたいこと
- Python の canvasapi を用いて Canvas LMS 上で課題の採点結果を履修者に開示する([成績表]で課題の[成績を掲示する]をスクリプトから実行する)。
実装方法の検討
- Canvas の REST API から実行できれば簡単だが、どうもその機能はなさそう。
- ブラウザで観察したところ、採点結果の公開には GraphQL を用いている。
- canvasapi には、GraphQL のクエリを実行する関数
Canvas.graphql
が用意されている。 - これを用いて実装してみる。
実装
Canvas.graphql
graphql(query, variables=
None
, **kwargs)
- Canvas に GraphQL 形式のリクエストを送信する
パラメータ
- query (str)
- 実行する GraphQL クエリの**文字列**
- variables (dict)
- クエリが要求する変数の**辞書**
戻り値
- GraphQL クエリに対するレスポンスを格納した辞書
クエリの形式
- この記事を書いている時点ではドキュメントは整っていないので、Canvas LMS のソースから抽出する。
canvas-lms/ui/shared/post-assignment-grades-tray/react/Api.js
export const POST_ASSIGNMENT_GRADES = gql`
mutation ($assignmentId: ID!, $gradedOnly: Boolean) {
postAssignmentGrades(input: {assignmentId: $assignmentId, gradedOnly: $gradedOnly}) {
progress {
_id
state
}
}
}
`
Python による実装
result = canvas.graphql(f'''
mutation {{
postAssignmentGrades(input: {{
assignmentId: {assignmentId},
gradedOnly: {gradedOnly}
}}) {{
progress {{
_id
state
}}
}}
}}
''')
-
canvas
はCanvas
オブジェクト -
assignmentId
は、操作したい課題のID(念のため文字列にキャストしておくとより安全) -
gradedOnly
は、"true"
または"false"
の文字列。"true"
なら、採点済みの提出物についてのみ採点結果を開示する。"false"
なら、履修者全員の採点結果を開示する。 -
この例では、レスポンスとして
_id
とstate
を要求している。レスポンスを格納する変数result
には以下のような辞書が返ってくる。
{
'data': {
'postAssignmentGrades': {
'progress': {
'_id': '785446',
'state': 'queued'
}
}
}
}