Пример #1
0
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')
Пример #3
0
# 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')