#!/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(response): source = response.read() t = compile(source, 'task.py', 'exec') exec(t) args_list = inspect.getargs(task.func_code)[0] return task, None, 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, task_check, 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