I like do update the usergrades of a quiz in moodle using the core_grades_update_grades function.
Unfortunately, I am not able to get the right parameters for the array at the end.
My code:
moodle = XXXXXX', token='XXXXXX')
courses = moodle('core_course_get_courses')
for course in courses:
course_id = course['id']
print("Processing Course:", course['fullname'])
# Retrieve all quizzes in the course
quizzes = moodle('mod_quiz_get_quizzes_by_courses', courseids=[course_id])
# Iterate over each quiz
for quiz in quizzes['quizzes']:
quiz_id = quiz['id']
print("Processing Quiz:", quiz['name'])
# Retrieve all enrolled users in the course
users = moodle('core_enrol_get_enrolled_users', courseid=course_id)
# Iterate over each user
for user in users:
user_id = user['id']
print("Processing User:", user['fullname'])
# Retrieve all quiz attempts for the user
quiz_attempts = moodle('mod_quiz_get_user_attempts', quizid=quiz_id, userid=user_id)
for attempt in quiz_attempts['attempts']:
attempt_id = attempt['id']
print("Processing Attempt:", attempt_id)
print(f"Attempt {attempt.get('grade',0)}")
# Get attempt details
attempt_details = moodle('mod_quiz_get_attempt_review', attemptid=attempt_id)
questions = attempt_details['questions']
regrade = False
# Iterate over each question in the attempt
for question in questions:
question_text = question['html']
grade = question.get('grade', 0)
# Check if question contains 'FG' and is answered with 0 points
if 'FG' in question_text and grade == 0:
regrade = True
break
if regrade:
user_grades = moodle('gradereport_user_get_grade_items', courseid=course_id, userid=user_id)
grade_items = user_grades['usergrades'][0]['gradeitems']
print(f"Print user grade: {user_grades}")
for grade_item in grade_items:
if grade_item['itemname'] == quiz['name']:
grade_item['graderaw'] = 0
print(f"Grade Item: {grade_item}")
result = moodle('core_grades_update_grades', source='quiz', courseid=course_id, component='mod_quiz', activityid=grade_item['id'], itemnumber=0, grades=[{'studentid': user_id, 'grade': 0}] )
print(f"Grade Update Result: {result}")
print(f"Grade for Quiz '{quiz['name']}' set to 0 for user {user_id}")
break
print("Grading process completed successfully.")
outcome:
Exception: moodle_exception
Message: invalidcoursemodule
Debug Info: