0

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:

Robert
  • 7,394
  • 40
  • 45
  • 64

0 Answers0