diff options
author | gasperfele@fri1.uni-lj.si <gasperfele@fri1.uni-lj.si@5cf9fbd1-b2bc-434c-b4b7-e852f4f63414> | 2014-11-21 08:33:49 +0000 |
---|---|---|
committer | gasperfele@fri1.uni-lj.si <gasperfele@fri1.uni-lj.si@5cf9fbd1-b2bc-434c-b4b7-e852f4f63414> | 2014-11-21 08:33:49 +0000 |
commit | 4ce9fe9a726b148c13fb98e8ac00715d438516a0 (patch) | |
tree | 6baea6fde65fe90a1ad240e1a9e66a98689518cb /kpov_judge/test_task.py | |
parent | 694bbfde8a947560beec9549e9068e64024e2d7a (diff) |
Updated the instructions on how to use the system
git-svn-id: https://svn.lusy.fri.uni-lj.si/kpov-public-svn/kpov-public@8 5cf9fbd1-b2bc-434c-b4b7-e852f4f63414
Diffstat (limited to 'kpov_judge/test_task.py')
-rwxr-xr-x | kpov_judge/test_task.py | 161 |
1 files changed, 91 insertions, 70 deletions
diff --git a/kpov_judge/test_task.py b/kpov_judge/test_task.py index 894bfe6..449be35 100755 --- a/kpov_judge/test_task.py +++ b/kpov_judge/test_task.py @@ -9,27 +9,49 @@ import dialog import os import inspect import sys +from bson.son import SON +import kpov_random_helpers # SERVER_URL = "http://localhost/kpov_judge/" -SERVER_URL = "http://kpov.fri.uni-lj.si/kpov_judge/" -TASK_URL = SERVER_URL + '{task_id}/task.py' -PARAMS_URL = SERVER_URL + '{task_id}/params.json' -SUBMIT_URL = SERVER_URL + '{task_id}/results.json' +#SERVER_URL = "http://kpov.fri.uni-lj.si/kpov_judge/" +#TASK_URL = SERVER_URL + '{task_id}/task.py' +#PARAMS_URL = SERVER_URL + '{task_id}/params.json' +#SUBMIT_URL = SERVER_URL + '{task_id}/results.json' +TASK_URL = "file://./" +PARAMS_URL = None PARAMS_FILE = os.path.expanduser("~/.kpov_params.yaml") +DEFAULT_LANGUAGE = 'si' -def get_params(params, param_names, meta, d): - for name in param_names: - m = meta.get(name, {}) - if d is not None: - ret, s = d.inputbox(m.get('opis', name), init=params.get(name, '')) +"""get the parameters for a task either from the user +or from a file.""" +def get_params_dialog(params, param_name_list, meta): + lang = params['language'] + for name in param_name_list: + if name not in meta: + pass + got_param = False + while not got_param: + m = meta.get(name, {}) + try: + description = m['descriptions'][lang] + except KeyError: + description = '' + ret, s = dialog.inputbox(m.get('descriptions', name), init=params.get(name, '')) if ret == 0 and m.get('w', False): params[name] = s - else: - if name not in params: - raise "Missing param: {0}".format(name) + got_param = (ret == 0) and name in params + return params + +def get_params_web(params, param_name_list, meta, url=PARAMS_URL): + req = urllib2.Request(url.format(**saved_params)) + response = urllib2.urlopen(req) + params = json.load(response) return params +def get_params_args(params, param_names_list, meta): + pass + def auth_open(url, username, password): password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() # Add the username and password. @@ -44,66 +66,65 @@ def auth_open(url, username, password): # Now all calls to urllib2.urlopen use our opener. urllib2.install_opener(opener) -def load_checker(request): - source = response.read() +def load_task(stream): + # the stream should compile into at least the function + # task(...) and a dictionary "params_meta". + source = stream.read() t = compile(source, 'task.py', 'exec') exec(t) - args_list = inspect.getargs(task.func_code)[0] - return task, args_list, param_meta - + # get a list of arguments for task(...) + # args_list = inspect.getargs(task.func_code)[0] + return task, task_check, params_meta + + if __name__ == '__main__': + # get default parameters try: - try: - saved_params = yaml.load(open(PARAMS_FILE)) - except: - print "Missing - creating anew.", PARAMS_FILE - saved_params = dict() - if len(sys.argv) > 1 and sys.argv[1] == '-q': - d = None + with open(PARAMS_FILE) as f: + saved_params = yaml.load(f) + except: + saved_params = dict() + # get the parameters needed to get to the task, such as the URLs, the name of the task and optionally an ID from the student + import argparse + task_argparser = argparse.ArgumentParser(description='Get the task parameters', conflict_handler='resolve', add_help=False) + task_argparser.add_argument('-h', '--help', action='store_true') + task_argparser.add_argument('-q', '--quiet', action='store_true', help='disable dialog') + task_argparser.add_argument('-pf','--params_file', nargs='?', + help='a local file containing saved param values', default=PARAMS_FILE) + basic_args = task_argparser.parse_args() + print basic_args + task_argparser.add_argument('-pu', '--params_url', nargs=1, + help='the URL for task parameters', default=PARAMS_URL) + task_argparser.add_argument('-tu', '--task_url', nargs='?', + help='the root URL for all tasks', default=TASK_URL) + task_argparser.add_argument('-l', '--language', nargs=1, + help='the language used', default=DEFAULT_LANGUAGE) + task_argparser.add_argument('task_name', help='task name') + args = task_argparser.parse_args() + print args + lang = args.language + print args.task_dir, args.task_name + task_fname = os.path.join(args.task_dir, args.task_name, 'task.py') + # get task source + try: + with open(task_fname) as source: + task, task_check, params_meta = load_task(source) + except: + if args.help: + task_argparser.print_help() else: - d = dialog.Dialog(dialog="dialog") - basic_params = { - # 'param_name': ('prompt', editable) - "student_id": {'opis':"Upor. ime:", 'w': True}, - "student_password": {'opis':"Geslo:", 'w': True}, - "task_id": {'opis': "Naloga:", 'w': True}} - saved_params = get_params(saved_params, ['student_id', 'student_password', 'task_id'], basic_params, d) - task_id = saved_params['task_id'] - yaml.dump(saved_params, open(PARAMS_FILE, 'w')) - auth_open(SERVER_URL, saved_params['student_id'], saved_params['student_password']) - # get parameters - req = urllib2.Request(PARAMS_URL.format(**saved_params)) - response = urllib2.urlopen(req) - web_params = json.load(response) - task_params_dict = saved_params.get('tasks', {}) - task_params = task_params_dict.get(task_id, {}) - saved_params['tasks'] = task_params_dict - task_params.update(web_params) - # get task source - req = urllib2.Request(TASK_URL.format(**saved_params)) - response = urllib2.urlopen(req) - # load task_check over the net - task, args_list, meta = load_checker(response) - # get missing parameters from user - task_params = get_params(task_params, args_list, meta, d) - # save - # run checker - valid_task_params = dict() - for i in args_list: - valid_task_params[i] = task_params[i] - saved_params['tasks'][task_id] = valid_task_params - results = task(**valid_task_params) - data = urllib.urlencode({ - 'results': json.dumps(results), - 'params': json.dumps(valid_task_params) - }) - req = urllib2.Request(SUBMIT_URL.format(**saved_params), data) - response = urllib2.urlopen(req) - if d is not None: - d.msgbox(response.read()) - yaml.dump(saved_params, open(PARAMS_FILE, 'w')) - # d.add_persistent_args([('background_title', 'KPOVv')]) - except Exception, e: - yaml.dump(saved_params, open(PARAMS_FILE, 'w')) - print "problem!" - print e + task_argparser.print_usage() + exit(1) + # get task parameters + params_argparser = argparse.ArgumentParser(parents=[task_argparser], conflict_handler='resolve', add_help=True) + for pm_name, pm in params_meta.iteritems(): + params_argparser.add_argument('--' + pm_name, nargs = 1, help=pm['descriptions'][lang]) + if args.help: + params_argparser.print_help() + args = params_argparser.parse_args() + # run task.task() + s = task(**public_params) + # run task.task_check() + result = task_check(s, params) + # print results + |