1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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
|