diff --git a/gen.py b/gen.py index 32c255ade96b1218055a0c804322e3d66f14e53a..ccf15c48a678f405f3b3b82360eaf68f5d2602b3 100755 --- a/gen.py +++ b/gen.py @@ -11,7 +11,7 @@ from hallgrim.messages import * from hallgrim.parser import * -def filename_to_module(name): +def file_to_module(name): return name.rstrip('.py').replace('/', '.') @@ -21,28 +21,73 @@ def type_selector(type): if 'single' in type: return 'SINGLE CHOICE QUESTION' +def file_exists(path): + if not os.path.exists(path): + msg = 'The script "{}" does not exist.'.format(path) + raise argparse.ArgumentTypeError(msg) + return path def parseme(): parser = argparse.ArgumentParser() - parser.add_argument( + subparsers = parser.add_subparsers(dest="command") + + parser_new = subparsers.add_parser("new", help="The utility the generate new scripts.") + parser_new.add_argument( + "name", + help="The name of the new script" + ) + parser_new.add_argument( + "-t", + "--type", + choices=['multi', 'single', 'gap', 'alignment'], + default='multi', + metavar='TYPE' + ) + parser_new.add_argument( + "-a", + "--author", + help="Name of the scripts author", + default='ILIAS Author', + metavar='AUTHOR' + ) + parser_new.add_argument( + "-p", + "--points", + help='Points given for correct answer (different behavior for different questions)', + type=float, + metavar='POINTS', + ) + + parser_gen = subparsers.add_parser("gen", help="Subcommand to convert from script to xml.") + parser_gen.add_argument( '-o', '--out', - help='''Specifiy different output file. If no argument is given the Name + help='''Specify different output file. If no argument is given the Name of the script is used.''', - type=argparse.FileType('w'), metavar='FILE') - parser.add_argument( + parser_gen.add_argument( 'input', help='Script to execute', + type=file_exists, metavar='FILE') + parser_gen.add_argument( + '-i', + '--instances', + help='How many instances should be produced (Only for parametrized questions).', + type=int, + default=1, + metavar='COUNT') args = parser.parse_args() - return args.out, args.input + if args.command == 'gen': + handle_choice_questions(args.out, args.input, args.instances) + if args.command == 'new': + handle_new_script(args.name, args.type, args.author, args.points) -def main(): - output, script_name = parseme() - script = importlib.import_module(filename_to_module(script_name)) + +def handle_choice_questions(output, script_name, instances): + script = importlib.import_module(file_to_module(script_name)) data = { 'type': type_selector(script.meta['type']), 'description': "_description", @@ -57,8 +102,11 @@ def main(): output = os.path.join( 'output', script.meta['title']) + '.xml' if not output else output - packer.convert_and_print(data, output) + packer.convert_and_print(data, output, instances) info('Processed "{}" and wrote xml to "{}".'.format(script_name, output)) +def handle_new_script(name, type, author, points): + raise NotImplementedError() + if __name__ == '__main__': - main() + parseme() diff --git a/hallgrim/IliasXMLCreator/packer.py b/hallgrim/IliasXMLCreator/packer.py index baae302d31cf98cb4a7a1b4615eab83906d43d72..022659384969cbae43a34a23623b29d58694a4a0 100644 --- a/hallgrim/IliasXMLCreator/packer.py +++ b/hallgrim/IliasXMLCreator/packer.py @@ -11,11 +11,11 @@ def create_xml_tree(item_list): return tree -def convert_and_print(data, output): +def convert_and_print(data, output, instances=1): if data['type'] == 'MULTIPLE CHOICE QUESTION': - item = multi.MultipleChoiceQuestion(**data)() + item_list = [multi.MultipleChoiceQuestion(**data)() for _ in range(instances)] if data['type'] == 'SINGLE CHOICE QUESTION': - item = single.SingleChoiceQuestion(**data)() + item_list = [single.SingleChoiceQuestion(**data)() for _ in range(instances)] - tree = create_xml_tree([item]) + tree = create_xml_tree(item_list) tree.write(output, encoding="utf-8", xml_declaration=True) diff --git a/scripts/param_example.py b/scripts/param_example.py new file mode 100644 index 0000000000000000000000000000000000000000..ef47ec2f2d366cef13a75bf4ba7d0772a0b2096c --- /dev/null +++ b/scripts/param_example.py @@ -0,0 +1,24 @@ +from random import randint, sample + +meta = { + 'author': 'Jan Maximilian Michal', + 'title': 'Parameter example', + 'type': 'single choice', + 'points': 4, # for correct answer +} + +a = randint(-50, 49) +b = randint(-50, 49) + + +def get_answers(right, count=4): + possible = sample(range(-100, a+b), count//2) + \ + sample(range(a+b+1, 100), count//2-1) + [a+b] + return [('X' if answer == right else ' ', answer) for answer in possible] + + +task = """ What is the answer to the question {} + {}?""".format(a, b) + +choices = '\n'.join('[%s] a + b = %d' % c for c in get_answers(a+b)) + +feedback = "[[a + b = {}]]".format(a + b)