quizcomp.cli.gradescope.upload

Create and upload a GradeScope PDF quiz.

usage: python3 -m quizcomp.cli.gradescope.upload [-h] [--version]
                                                 [--out-dir OUT_DIR]
                                                 [--skip-tex] [--skip-pdf]
                                                 [--variants VARIANTS]
                                                 [--skip-key] [--seed SEED]
                                                 [--rubric] --course COURSE_ID
                                                 --user USER --pass PASSWORD
                                                 [--force] [--save-http]
                                                 PATH

Create and upload a GradeScope PDF quiz.

positional arguments:
    PATH                The path to a JSON file.

options:
    -h, --help          show this help message and exit
    --version           show program's version number and exit
    --out-dir OUT_DIR   The directory to put the output (default: .).
    --skip-tex          Skip creating TeX files (default: False).
    --skip-pdf          Skip compiling PDFs from TeX (default: False).
    --variants VARIANTS
                        The number of quiz variants to create (default: 1).
    --skip-key          Skip creating the answer key (default: False).
    --seed SEED         The random seed to use (defaults to a random seed).
    --rubric            Create an initial rubric for this assignment in
                        GradeScope (default: False).
    --course COURSE_ID  Course ID to upload the quiz under.
    --user USER         The user to authenticate as.
    --pass PASSWORD     The password to use.
    --force             Override (delete) any exiting quiz with the same name
                        (default: False).
    --save-http         Save any http requests to a debugging directory
                        (default: False).
 1"""
 2Create and upload a GradeScope PDF quiz.
 3"""
 4
 5import argparse
 6import logging
 7import os
 8import sys
 9
10import edq.util.dirent
11import edq.util.json
12
13import quizcomp.cli.parser
14import quizcomp.uploader.gradescope
15import quizcomp.util.pdf
16
17_logger = logging.getLogger(__name__)
18
19def run_cli(args: argparse.Namespace) -> int:
20    """ Run the CLI. """
21
22    quiz, variants, options = quizcomp.util.pdf.make_with_args(args, write_options = False)
23    base_out_dir = options['out_dir']
24
25    options['gradescope'] = {
26        'course': args.course_id,
27        'rubric': args.rubric,
28        'user': args.user,
29    }
30
31    for (i, variant) in enumerate(variants):
32        out_dir = options['variants'][i]['out_dir']
33
34        uploader = quizcomp.uploader.gradescope.GradeScopeUploader(args.course_id, args.user, args.password,
35                force = args.force, rubric = args.rubric,
36                save_http = args.save_http)
37        gradescope_id, _ = uploader.upload_quiz(variant, base_dir = out_dir)
38
39        options['variants'][i]['gradescope_id'] = gradescope_id
40
41    # If there are multiple variants and all variants were created (non were skipped).
42    if (len(variants) > 1):
43        ids = [variants_data['gradescope_id'] for variants_data in options['variants']]
44
45        uploader = quizcomp.uploader.gradescope.GradeScopeUploader(args.course_id, args.user, args.password,
46                save_http = args.save_http)
47        uploader.create_assignment_group(quiz.get_name(), ids)
48        _logger.info("Created GradeScope Assignment Group: '%s'.", quiz.get_name())
49
50    path = os.path.join(base_out_dir, quizcomp.util.pdf.OPTIONS_FILENAME)
51    edq.util.json.dump_path(options, path, indent = 4)
52
53    return 0
54
55def main() -> int:
56    """ Get a parser, parse the args, and call run. """
57
58    return run_cli(_get_parser().parse_args())
59
60def _get_parser() -> argparse.ArgumentParser:
61    """ Get the parser. """
62
63    parser = quizcomp.cli.parser.get_parser(__doc__.strip(),
64        include_net = True,
65        include_latex = True,
66    )
67
68    quizcomp.util.pdf.modify_parser(parser)
69
70    parser.add_argument('--rubric', dest = 'rubric',
71        action = 'store_true', default = False,
72        help = 'Create an initial rubric for this assignment in GradeScope (default: %(default)s).')
73
74    parser.add_argument('--course', dest = 'course_id',
75        action = 'store', type = str, required = True,
76        help = 'Course ID to upload the quiz under.')
77
78    parser.add_argument('--user', dest = 'user',
79        action = 'store', type = str, required = True,
80        help = 'The user to authenticate as.')
81
82    parser.add_argument('--pass', dest = 'password',
83        action = 'store', type = str, required = True,
84        help = 'The password to use.')
85
86    parser.add_argument('--force', dest = 'force',
87        action = 'store_true', default = False,
88        help = 'Override (delete) any exiting quiz with the same name (default: %(default)s).')
89
90    parser.add_argument('--save-http', dest = 'save_http',
91        action = 'store_true', default = False,
92        help = 'Save any http requests to a debugging directory (default: %(default)s).')
93
94    return parser
95
96if (__name__ == '__main__'):
97    sys.exit(main())
def run_cli(args: argparse.Namespace) -> int:
20def run_cli(args: argparse.Namespace) -> int:
21    """ Run the CLI. """
22
23    quiz, variants, options = quizcomp.util.pdf.make_with_args(args, write_options = False)
24    base_out_dir = options['out_dir']
25
26    options['gradescope'] = {
27        'course': args.course_id,
28        'rubric': args.rubric,
29        'user': args.user,
30    }
31
32    for (i, variant) in enumerate(variants):
33        out_dir = options['variants'][i]['out_dir']
34
35        uploader = quizcomp.uploader.gradescope.GradeScopeUploader(args.course_id, args.user, args.password,
36                force = args.force, rubric = args.rubric,
37                save_http = args.save_http)
38        gradescope_id, _ = uploader.upload_quiz(variant, base_dir = out_dir)
39
40        options['variants'][i]['gradescope_id'] = gradescope_id
41
42    # If there are multiple variants and all variants were created (non were skipped).
43    if (len(variants) > 1):
44        ids = [variants_data['gradescope_id'] for variants_data in options['variants']]
45
46        uploader = quizcomp.uploader.gradescope.GradeScopeUploader(args.course_id, args.user, args.password,
47                save_http = args.save_http)
48        uploader.create_assignment_group(quiz.get_name(), ids)
49        _logger.info("Created GradeScope Assignment Group: '%s'.", quiz.get_name())
50
51    path = os.path.join(base_out_dir, quizcomp.util.pdf.OPTIONS_FILENAME)
52    edq.util.json.dump_path(options, path, indent = 4)
53
54    return 0

Run the CLI.

def main() -> int:
56def main() -> int:
57    """ Get a parser, parse the args, and call run. """
58
59    return run_cli(_get_parser().parse_args())

Get a parser, parse the args, and call run.