summaryrefslogtreecommitdiff
path: root/kpov_judge/test_task.py
blob: 894bfe6523da95367bdc5add4bf5301a91e518f6 (plain)
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