From be32ceb69271797a38b24d07930ac9afcd0c729f Mon Sep 17 00:00:00 2001 From: "gasperfele@fri1.uni-lj.si" Date: Mon, 20 Oct 2014 08:42:08 +0000 Subject: Initial commit git-svn-id: https://svn.lusy.fri.uni-lj.si/kpov-public-svn/kpov-public@1 5cf9fbd1-b2bc-434c-b4b7-e852f4f63414 --- kpov_judge/run_test.py | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100755 kpov_judge/run_test.py (limited to 'kpov_judge/run_test.py') diff --git a/kpov_judge/run_test.py b/kpov_judge/run_test.py new file mode 100755 index 0000000..894bfe6 --- /dev/null +++ b/kpov_judge/run_test.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import yaml +import json +import urllib +import urllib2 +import dialog +import os +import inspect +import sys + +# 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' + +PARAMS_FILE = os.path.expanduser("~/.kpov_params.yaml") + +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, '')) + if ret == 0 and m.get('w', False): + params[name] = s + else: + if name not in params: + raise "Missing param: {0}".format(name) + return params + +def auth_open(url, username, password): + password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() +# Add the username and password. +# If we knew the realm, we could use it instead of None. + password_mgr.add_password(None, SERVER_URL, username, password) + handler = urllib2.HTTPBasicAuthHandler(password_mgr) +# create "opener" (OpenerDirector instance) + opener = urllib2.build_opener(handler) +# use the opener to fetch a URL +# opener.open(SERVER_URL) +# Install the opener. +# Now all calls to urllib2.urlopen use our opener. + urllib2.install_opener(opener) + +def load_checker(request): + source = response.read() + t = compile(source, 'task.py', 'exec') + exec(t) + args_list = inspect.getargs(task.func_code)[0] + return task, args_list, param_meta + +if __name__ == '__main__': + 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 + 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 -- cgit v1.2.1