def aggregate_values(pass_on_values, args, form): pass_on_values = dict(pass_on_values) for key in pass_on_values: if hasattr(args, key) and getattr(args, key) is not None: if isinstance(pass_on_values[key], (list, tuple)) and not isinstance(getattr(args, key), (list, tuple)): pass_on_values[key] = [getattr(args, key)] else: pass_on_values[key] = getattr(args, key) rtn = {} for key in pass_on_values: if isinstance(pass_on_values[key], bool): rtn[key] = get_boolean_value(form, key, default=pass_on_values[key]) else: rtn[key] = form.getfirst(key, pass_on_values[key]) if isinstance(rtn[key], str) and any(sign_char in rtn[key] for sign_char in PLUS_MINUS_STRINGS): for sign_char in PLUS_MINUS_STRINGS: rtn[key] = rtn[key].replace(sign_char, PLUS_MINUS_CHAR) rtn[key] = rtn[key].split(PLUS_MINUS_CHAR) rtn[key] = list(map(int, rtn[key])) elif isinstance(rtn[key], (tuple, list)): rtn[key] = list(map(int, rtn[key])) elif isinstance(rtn[key], bool): pass elif isinstance(pass_on_values[key], (list, tuple)): rtn[key] = [int(rtn[key])] elif isinstance(pass_on_values[key], int): rtn[key] = int(rtn[key]) elif isinstance(pass_on_values[key], float): rtn[key] = float(rtn[key]) if isinstance(rtn[key], list) and len(rtn[key]) < 2: rtn[key].append(0) return rtn
def main(): form = cgi.FieldStorage(keep_blank_values=True) non_existant_variable = form.getvalue('&=variableDoesNotExistString=&') if 'help' in sys.argv[1:] and get_boolean_value(form, 'help'): # so that a web call with ?help works, since parser normally calls sys.exit if it doesn't understand the arguments return construct_character_set(form, None, help=True) args = parser.parse_args() rtn = construct_character_set(form, args, verbose=args.verbose) if rtn: print('Content-type: text/plain\n') print(json.dumps(rtn))
def main(): form = cgi.FieldStorage(keep_blank_values=True) non_existant_variable = form.getvalue('&=variableDoesNotExistString=&') if 'help' in sys.argv[1:] and get_boolean_value( form, 'help' ): # so that a web call with ?help works, since parser normally calls sys.exit if it doesn't understand the arguments return construct_character_set(form, None, help=True) args = parser.parse_args() rtn = construct_character_set(form, args, verbose=args.verbose) if rtn: print('Content-type: text/plain\n') print(json.dumps(rtn))
def create_first_task(form, args, reset=False, verbose=False): if "taskGroupIndex" in form.keys(): task_group_index = int(form.getfirst("taskGroupIndex")) else: task_group_index = 0 passOnValues = { "pauseToFirstHint": [500], "pauseToSecondHint": [500], "pauseToExample": [1000], "pauseToNoise": [50], "pauseToTest": [1000], "tasksPerFeedbackGroup": [10], "tasksPerWaitGroup": [10], "pauseToGroup": [-1], "displayProgressBarDuringTask": False, "allowDidNotSeeCount": [1], "random": False, "characterSet": None, "trialsPerExperiment": 200, "fractionSame": 0.5, # this was 0.25 before the RT task, changed to 0.5 for RT "calibrationTaskCount": 25, } rtn = aggregate_values(passOnValues, args, form) if get_boolean_value(form, "random", default=passOnValues["random"]): tasks = make_get_random_task(form, passOnValues, verbose=verbose) else: tasks = get_a_task(task_group_index, reset=reset, verbose=verbose) alphabets = get_accepted_image_list(from_path=FROM_PATH) tasks = [ ( anonymize_image(alphabets[task[0][0]][task[0][2]][task[0][1]], from_path=FROM_PATH), anonymize_image(alphabets[task[1][0]][task[1][2]][task[1][1]], from_path=FROM_PATH), task[0][0] == task[1][0] and task[0][1] == task[1][1], ) for task in tasks ] tasks = [ ( example, test, urllib.parse.urljoin(BASE_URL, random.choice(_STROKE_NOISES)), correct_answer, ) # http://www.quasimondo.com/hydra/sineNoise1.jpg') for example, test, correct_answer in tasks ] rtn["tasks"] = tasks return rtn
def create_first_task(form, args, reset=False, verbose=False): if 'taskGroupIndex' in form.keys(): task_group_index = int(form.getfirst('taskGroupIndex')) else: task_group_index = 0 passOnValues = { 'pauseToFirstHint': [500], 'pauseToSecondHint': [500], 'pauseToExample': [1000], 'pauseToNoise': [50], 'pauseToTest': [1000], 'tasksPerFeedbackGroup': [10], 'tasksPerWaitGroup': [10], 'pauseToGroup': [-1], 'displayProgressBarDuringTask': False, 'allowDidNotSeeCount': [1], 'random': False, 'characterSet': None, 'trialsPerExperiment': 200, 'fractionSame': 0.5, # this was 0.25 before the RT task, changed to 0.5 for RT 'calibrationTaskCount': 25 } rtn = aggregate_values(passOnValues, args, form) if get_boolean_value(form, 'random', default=passOnValues['random']): tasks = make_get_random_task(form, passOnValues, verbose=verbose) else: tasks = get_a_task(task_group_index, reset=reset, verbose=verbose) alphabets = get_accepted_image_list(from_path=FROM_PATH) tasks = [(anonymize_image(alphabets[task[0][0]][task[0][2]][task[0][1]], from_path=FROM_PATH), anonymize_image(alphabets[task[1][0]][task[1][2]][task[1][1]], from_path=FROM_PATH), task[0][0] == task[1][0] and task[0][1] == task[1][1]) for task in tasks] tasks = [ (example, test, urllib.parse.urljoin(BASE_URL, random.choice(_STROKE_NOISES)), correct_answer) #http://www.quasimondo.com/hydra/sineNoise1.jpg') for example, test, correct_answer in tasks ] rtn['tasks'] = tasks return rtn
def aggregate_values(pass_on_values, args, form): pass_on_values = dict(pass_on_values) for key in pass_on_values: if hasattr(args, key) and getattr(args, key) is not None: if isinstance( pass_on_values[key], (list, tuple)) and not isinstance(getattr(args, key), (list, tuple)): pass_on_values[key] = [getattr(args, key)] else: pass_on_values[key] = getattr(args, key) rtn = {} for key in pass_on_values: if isinstance(pass_on_values[key], bool): rtn[key] = get_boolean_value(form, key, default=pass_on_values[key]) else: rtn[key] = form.getfirst(key, pass_on_values[key]) if isinstance(rtn[key], str) and any( sign_char in rtn[key] for sign_char in PLUS_MINUS_STRINGS): for sign_char in PLUS_MINUS_STRINGS: rtn[key] = rtn[key].replace(sign_char, PLUS_MINUS_CHAR) rtn[key] = rtn[key].split(PLUS_MINUS_CHAR) rtn[key] = list(map(int, rtn[key])) elif isinstance(rtn[key], (tuple, list)): rtn[key] = list(map(int, rtn[key])) elif isinstance(rtn[key], bool): pass elif isinstance(pass_on_values[key], (list, tuple)): rtn[key] = [int(rtn[key])] elif isinstance(pass_on_values[key], int): rtn[key] = int(rtn[key]) elif isinstance(pass_on_values[key], float): rtn[key] = float(rtn[key]) if isinstance(rtn[key], list) and len(rtn[key]) < 2: rtn[key].append(0) return rtn
def construct_character_set(form, args, reset=False, verbose=False, help=False): if get_boolean_value(form, 'help', default=help): print('Content-type: text/html\n') print("""<p>You may any of the following permissible url parameters:</p> <ul> <li> <b>characters</b> - A list of characters that must be used, in the form [<em>alphabet</em>, <em>number</em>], where <em>number</em> is a one-based index. For example, <tt>?characters=[["latin", 1], ["latin", 2], ["greek", 10]]</tt>. <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span> </li> <li> <b>alphabets</b> - A list of alphabets from which to draw the characters. For example, <tt>?constructCharacterSet&alphabets=["latin", "greek", "hebrew"]</tt>. Does not work well with <b>nonAlphabets</b>. <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span> </li> <li> <b>drawers</b> - A list of alphabet/drawer pairs that must be used, in the form [<em>alphabet</em>, <em>id</em>]. For example, <tt>?drawers=[["latin", "a1j8s7giuyto4a"], ["latin", "a1kj5bqqwzijjt"], ["greek", "a2pfktghhg1ofp"]]</tt>. <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span> </li> <li> <b>nonAlphabets</b> - A list of alphabets from which characters may not be drawn. For example, <tt>?constructCharacterSet&nonAlphabets=["latin", "greek", "hebrew"]</tt>. Does not work well with <b>alphabets</b>. <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span> </li> <li><b>totalCharacters</b> - the total number of characters to draw. </li> <li><b>alias</b> - the name of the structure. If you do not choose an alias, you will be given a hash code. </li> <li><b>overwrite</b> - whether or not an already existent character set should be overwritten. Either <tt>true</tt> or <tt>false</tt>.</li> <li><b>get</b> - If you want to see the current contents of a character set, use this parameter. For example, <tt>?get=small</tt>.</li> </ul>""") return False try: get_alias = form.getfirst('get', args.get) if get_alias: def do_error(): raise ValueError('No structure with alias "%s" exists.' % get_alias) return get_object(CHARACTER_SET_NAME_FORMAT % get_alias, do_error, is_old=(lambda x: False)) drawers = get_list_of_values(form, 'drawers', args.drawers) characters = get_list_of_values(form, 'characters', args.characters) alphabets = get_list_of_values(form, 'alphabets', args.alphabets) non_alphabets = get_list_of_values(form, 'nonAlphabets', args.non_alphabets) totalCharacters = int(form.getfirst('totalCharacters', args.total_characters)) alias = form.getfirst('alias', args.alias) overwrite = get_boolean_value(form, 'overwrite', default=((not args.no_overwrite) and (args.overwrite or (alias is None)))) if characters: rtn = [(alphabet, int(ch_num) - 1) for alphabet, ch_num in characters] elif alphabets: rtn = alphabets elif drawers: rtn = [(alphabet, '*', uid) for alphabet, uid in drawers] elif non_alphabets: rtn = [alphabet for alphabet in get_accepted_image_list() if alphabet not in nonAlphabets and alphabet.lower() not in nonAlphabets] else: raise Exception("Insufficient parameters for decision") rtn.sort() if not alias: alias = str(hash(rtn)) except Exception: construct_character_set(form, args, help=True) raise if rtn != get_object(CHARACTER_SET_NAME_FORMAT % alias, (lambda: rtn), is_old=(lambda x: overwrite)): raise Exception('Structure with given alias (%s) already exists. Pick a new alias.' % alias) return {'alias':alias}
def construct_character_set(form, args, reset=False, verbose=False, help=False): if get_boolean_value(form, 'help', default=help): print('Content-type: text/html\n') print( """<p>You may any of the following permissible url parameters:</p> <ul> <li> <b>characters</b> - A list of characters that must be used, in the form [<em>alphabet</em>, <em>number</em>], where <em>number</em> is a one-based index. For example, <tt>?characters=[["latin", 1], ["latin", 2], ["greek", 10]]</tt>. <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span> </li> <li> <b>alphabets</b> - A list of alphabets from which to draw the characters. For example, <tt>?constructCharacterSet&alphabets=["latin", "greek", "hebrew"]</tt>. Does not work well with <b>nonAlphabets</b>. <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span> </li> <li> <b>drawers</b> - A list of alphabet/drawer pairs that must be used, in the form [<em>alphabet</em>, <em>id</em>]. For example, <tt>?drawers=[["latin", "a1j8s7giuyto4a"], ["latin", "a1kj5bqqwzijjt"], ["greek", "a2pfktghhg1ofp"]]</tt>. <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span> </li> <li> <b>nonAlphabets</b> - A list of alphabets from which characters may not be drawn. For example, <tt>?constructCharacterSet&nonAlphabets=["latin", "greek", "hebrew"]</tt>. Does not work well with <b>alphabets</b>. <span style="color:red"><strong>Note that the quotes (") are mandatory.</strong></span> </li> <li><b>totalCharacters</b> - the total number of characters to draw. </li> <li><b>alias</b> - the name of the structure. If you do not choose an alias, you will be given a hash code. </li> <li><b>overwrite</b> - whether or not an already existent character set should be overwritten. Either <tt>true</tt> or <tt>false</tt>.</li> <li><b>get</b> - If you want to see the current contents of a character set, use this parameter. For example, <tt>?get=small</tt>.</li> </ul>""") return False try: get_alias = form.getfirst('get', args.get) if get_alias: def do_error(): raise ValueError('No structure with alias "%s" exists.' % get_alias) return get_object(CHARACTER_SET_NAME_FORMAT % get_alias, do_error, is_old=(lambda x: False)) drawers = get_list_of_values(form, 'drawers', args.drawers) characters = get_list_of_values(form, 'characters', args.characters) alphabets = get_list_of_values(form, 'alphabets', args.alphabets) non_alphabets = get_list_of_values(form, 'nonAlphabets', args.non_alphabets) totalCharacters = int( form.getfirst('totalCharacters', args.total_characters)) alias = form.getfirst('alias', args.alias) overwrite = get_boolean_value(form, 'overwrite', default=((not args.no_overwrite) and (args.overwrite or (alias is None)))) if characters: rtn = [(alphabet, int(ch_num) - 1) for alphabet, ch_num in characters] elif alphabets: rtn = alphabets elif drawers: rtn = [(alphabet, '*', uid) for alphabet, uid in drawers] elif non_alphabets: rtn = [ alphabet for alphabet in get_accepted_image_list() if alphabet not in nonAlphabets and alphabet.lower() not in nonAlphabets ] else: raise Exception("Insufficient parameters for decision") rtn.sort() if not alias: alias = str(hash(rtn)) except Exception: construct_character_set(form, args, help=True) raise if rtn != get_object(CHARACTER_SET_NAME_FORMAT % alias, (lambda: rtn), is_old=(lambda x: overwrite)): raise Exception( 'Structure with given alias (%s) already exists. Pick a new alias.' % alias) return {'alias': alias}
def create_first_task(form, args, verbose=False): passOnValues = {'pauseToFirstHint':[500], 'pauseToSecondHint':[500], 'pauseToAnchor':[1000], 'pauseToNoise':[-1], 'pauseToTest':[1000], 'tasksPerFeedbackGroup':[10], 'pauseToNextGroup':[-1], 'displayProgressBarDuringTask':False, 'allowDidNotSeeCount':[1], 'taskCount':50, 'anchorCount':1, 'classCount':20, 'unique':False, 'uniqueClasses':True, 'confirmToContinue':True, 'anchorPosition':'above', 'sameAlphabetClassCount':-1, 'characterSize':'50px', 'characterSet':'' } for key in passOnValues: if hasattr(args, key) and getattr(args, key) is not None: if isinstance(passOnValues[key], (list, tuple)) and not isinstance(getattr(args, key), (list, tuple)): passOnValues[key] = [getattr(args, key)] else: passOnValues[key] = getattr(args, key) rtn = {} for key in passOnValues: if isinstance(passOnValues[key], bool): rtn[key] = get_boolean_value(form, key, default=passOnValues[key]) else: rtn[key] = form.getfirst(key, passOnValues[key]) if isinstance(rtn[key], str) and any(sign_char in rtn[key] for sign_char in PLUS_MINUS_STRINGS): for sign_char in PLUS_MINUS_STRINGS: rtn[key] = rtn[key].replace(sign_char, PLUS_MINUS_CHAR) rtn[key] = rtn[key].split(PLUS_MINUS_CHAR) rtn[key] = list(map(int, rtn[key])) elif isinstance(rtn[key], (tuple, list)): rtn[key] = list(map(int, rtn[key])) elif isinstance(rtn[key], bool): pass elif isinstance(passOnValues[key], (list, tuple)): rtn[key] = [int(rtn[key])] elif isinstance(passOnValues[key], int): rtn[key] = int(rtn[key]) elif isinstance(passOnValues[key], float): rtn[key] = float(rtn[key]) if isinstance(rtn[key], list) and len(rtn[key]) < 2: rtn[key].append(0) rtn['imagesPerTask'] = 2 * rtn['anchorCount'] + rtn['classCount'] if rtn['characterSet']: rtn['tasks'] = make_task_from_alphabet_set(rtn['characterSet'], verbose=verbose, anchor_count=rtn['anchorCount'], class_count=rtn['classCount'], same_alphabet_class_count=rtn['sameAlphabetClassCount'], task_count=rtn['taskCount'], unique=rtn['unique'], unique_classes=rtn['uniqueClasses']) else: rtn['tasks'] = make_task(verbose=verbose, anchor_count=rtn['anchorCount'], class_count=rtn['classCount'], same_alphabet_class_count=rtn['sameAlphabetClassCount'], task_count=rtn['taskCount'], unique=rtn['unique'], unique_classes=rtn['uniqueClasses']) return rtn