summaryrefslogtreecommitdiff
path: root/kpov_judge/test_task.py
diff options
context:
space:
mode:
authorgasperfele@fri1.uni-lj.si <gasperfele@fri1.uni-lj.si@5cf9fbd1-b2bc-434c-b4b7-e852f4f63414>2014-11-21 08:33:49 +0000
committergasperfele@fri1.uni-lj.si <gasperfele@fri1.uni-lj.si@5cf9fbd1-b2bc-434c-b4b7-e852f4f63414>2014-11-21 08:33:49 +0000
commit4ce9fe9a726b148c13fb98e8ac00715d438516a0 (patch)
tree6baea6fde65fe90a1ad240e1a9e66a98689518cb /kpov_judge/test_task.py
parent694bbfde8a947560beec9549e9068e64024e2d7a (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-xkpov_judge/test_task.py161
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
+