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.