def upload_grade(api: markusapi.Markus, assignment_id: int, criteria: Dict[str, Tuple[str, float]], utorid: str, gbook: gb.GradeBook = None, gf_file: TextIO = None, group_id: int = None, complete=True): """Upload grades for one student. criteria maps test-name-in-gf-file to (criteria-name, out-of) on MarkUs. criteria on MarkUs needs to be set up beforehand. Can't find a way to upload it with API... TODO. if gbook is None, reload from gf_file if group_id is None, download group info from MarkUs. if complete, set MarkUs submission status to "complete" """ if group_id is None: try: group_id = _get_group_id(api, assignment_id, utorid) except NoMarkUsGroupError as error: print(error) return if gbook is None: gbook = gb.GradeBook.load_gf_file(gf_file, 'utorid', True) try: grades = gbook.get_student_grades_by_utorid(utorid) criteria_mark_map = { criteria[test_name][0]: grades.get_grade(test_name) * criteria[test_name][2] / criteria[test_name][1] for test_name in criteria } except Exception as exn: # no grade for this student print('Warning: no grades info for {}. Uploading 0. ({})'.format( utorid, exn)) criteria_mark_map = {name: 0 for (name, _, _) in criteria.values()} # HACK: undo complete state api.update_marking_state(assignment_id, group_id, 'incomplete') response = api.update_marks_single_group(criteria_mark_map, assignment_id, group_id) # 200 is success if response.get('status', 0) == 500 or response.get('code', 0) != '200': print('Could not upload grades for {}: {}.'.format(utorid, response)) return if complete: response = api.update_marking_state(assignment_id, group_id, 'complete') # 200 is success if response.get('status', 0) == 500 or response.get('code', 0) != '200': print('Could not set state to complete for {}: {}.'.format( utorid, response))
FILE_NAME)) as open_file: file_contents = open_file.read() # Upload the feedback file try: response = api.upload_feedback_file( ASSIGNMENT_ID, group_id, FILE_NAME, file_contents) print( 'Uploaded feedback file for {}, Markus responded: {}'. format(group_name, response)) except: print( 'Error: uploading feedback file for {} failed'.format( group_name)) # Extract and upload marks from the feedback file try: results = process_marks(file_contents) response = api.update_marks_single_group( results, ASSIGNMENT_ID, group_id) print('Uploaded marks for {}, Markus responded: {}'.format( group_name, response)) response = api.update_marking_state( ASSIGNMENT_ID, group_id, 'complete') print('Updated marking state for {}, Markus responded: {}'. format(group_name, response)) except: print('Error: uploading marks for {} failed'.format( group_name)) except: print('Error: accessing repository {} failed.'.format(group_name)) print('Finished')
# Initialize an instance of the API class api = Markus(API_KEY, ROOT_URL) print('Initialized Markus object successfully.') groups = api.get_groups(ASSIGNMENT_ID) for group in groups: group_name = group['group_name'] group_id = group['id'] try: with open(ROOT_DIR + '/' + group_name + '/' + FILE_NAME) as open_file: file_contents = open_file.read() # Upload the feedback file try: response = api.upload_feedback_file(ASSIGNMENT_ID, group_id, FILE_NAME, file_contents) print('Uploaded feedback file for {}, Markus responded: {}'.format(group_name, response)) except: print('Error: uploading feedback file for {} failed'.format(group_name)) # Extract and upload marks from the feedback file try: results = process_marks(file_contents) response = api.update_marks_single_group(results, ASSIGNMENT_ID, group_id) print('Uploaded marks for {}, Markus responded: {}'.format(group_name, response)) response = api.update_marking_state(ASSIGNMENT_ID, group_id, 'complete') print('Updated marking state for {}, Markus responded: {}'.format(group_name, response)) except: print('Error: uploading marks for {} failed'.format(group_name)) except: print('Error: accessing repository {} failed.'.format(group_name)) print('Finished')