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-10-21 21:35:40 +0000
committergasperfele@fri1.uni-lj.si <gasperfele@fri1.uni-lj.si@5cf9fbd1-b2bc-434c-b4b7-e852f4f63414>2014-10-21 21:35:40 +0000
commitf3e2c6f2add893710dc9a54098acff13c5934a90 (patch)
tree7e03f8787f9cc383a2b7b0c51cd30b9b66a61c13 /kpov_judge/test_task.py
parentbe32ceb69271797a38b24d07930ac9afcd0c729f (diff)
Separated tasks from lectures
git-svn-id: https://svn.lusy.fri.uni-lj.si/kpov-public-svn/kpov-public@2 5cf9fbd1-b2bc-434c-b4b7-e852f4f63414
Diffstat (limited to 'kpov_judge/test_task.py')
-rwxr-xr-xkpov_judge/test_task.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/kpov_judge/test_task.py b/kpov_judge/test_task.py
new file mode 100755
index 0000000..894bfe6
--- /dev/null
+++ b/kpov_judge/test_task.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