#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import json import re import crypt print("Handler choice/multiple loaded!") # helper # analog to value of html input field (checkbox/radio) it feels kinda odd to # use this, maybe settle with another hash function than the default this only # requires performance not cryptographic security def hash(arg): return crypt.crypt(str(arg)) def parse_choice(raw_choice): choice = {"text": "", "is": "incorrect", "value": ""} result = re.findall(r"^([*!]?)(.*)$", raw_choice, re.DOTALL) value = hash(result[0][1]) if result[0][0] == '*': choice = {"text": result[0][1], "is": "correct", "value": value} elif result[0][0] == '!': choice = {"text": result[0][1], "is": "required", "value": value} else: choice = {"text": result[0][1], "is": "incorrect", "value": value} return choice class ExerciseHandler(object): def __init__(self, parser=None): self.parser = parser self.data = {'choices': [''], 'question': ''} print("ExerciseHandler choice/multiple") print("parser.path", parser.path) item = self.parser.item data = self.data # enable grading for this exercise type item.grading = True item.content = self.parser.get_exercise_content() data['question'] = self.parser.get_file_content('question') # import and sanitize choices data['choices'] = self.parser.get_file_content('choices').split('\n') for i,choice in enumerate(data['choices']): data['choices'][i] = parse_choice(choice) # determine how to render choices data['input_type'] = "checkbox" if 'choose' in parser.meta: if parser.meta['choose'] == "one": data['input_type'] = "radio" item.data = json.dumps(self.data) item.save()